2011-05-20 12 views
8

मुझे या तो रूबी विधि या एक नियमित अभिव्यक्ति चाहिए जो मुझे एक एआरजीवी-जैसी सरणी में कमांड लाइन तर्कों की एक स्ट्रिंग को विभाजित करने देगी। मैं जो पूछ रहा हूं वह this question के समान है, लेकिन रूबी में है।एआरजीवी को पॉप्युलेट करने के लिए मैं एक स्ट्रिंग पसंद शैल कैसे विभाजित कर सकता हूं?

मैं रूबी प्रोग्राम के लिए यूनिट परीक्षण लिख रहा हूं जो ट्रोलॉप का उपयोग करके कमांड लाइन इनपुट को संसाधित करता है (हालांकि यह प्रश्न किसी अन्य विकल्प पार्सर के लिए समान होगा)।

विधि मैं परीक्षण करना चाहते हैं इस तरह दिखता है:

def parse_args(args) 
    Trollop::options(args) do 
    # ... parse options based on flags 
    end 
end 

मेरा कार्यक्रम में, मैं parse_args(ARGV) कहते हैं। मेरे परीक्षण में, मैंने सोचा कि मैं बस रिक्त स्थान पर एक स्ट्रिंग विभाजन में गुजर सकता हूं, लेकिन यह एआरजीवी का व्यवहार नहीं है। निम्नलिखित की तुलना करें:

./argv_example.rb -f -m "Hello world" --extra-args "-vvv extra verbose" 
=> ["-f", "-m", "Hello world", "--extra-args", "-vvv extra verbose"] 

'-f -m "Hello world" --extra-args "-vvv extra verbose"'.split 
=> ["-f", "-m", "\"Hello", "world\"", "--extra-args", "\"-vvv", "extra", "verbose\""] 

उत्तर

11

वहाँ Shellwords है अगर आप 1.9 का उपयोग कर रहे हैं। यदि आप 1.9 का उपयोग नहीं कर रहे हैं लेकिन रेल हैं तो आपको रेल से Shellwords मिल जाएगा। या तो मामले में, आप एक स्ट्रिंग पार्स करने में एक POSIX खोल की तरह Shellwords.shellwords उपयोग कर सकते हैं:

>> Shellwords.shellwords("Where is 'pancakes house'?") 
=> ["Where", "is", "pancakes house?"] 

आप रेल नहीं है, तो या 1.9 तो आप शायद सिर्फ रेल से shellwords.rb पकड़ें और उसे इस्तेमाल कर सकते हैं।

अद्यतन: ऐसा लगता है कि Shellwords रूबी 1.8 (धन्यवाद माइकल खोल) में उपलब्ध है। मुझे अस्पष्ट परिणाम मिल रहे थे कि किस विशिष्ट संस्करण में यह था।

+4

+1, लेकिन यह ध्यान रखना चाहता था कि यह भी 1.8.7 में काम करता है। (और यहां तक ​​कि 1.8.6, मैंने अभी कोशिश की)। http://www.ruby-doc.org/ruby-1.8/classes/Shellwords.html –

+0

@ माइकल: धन्यवाद, मुझे इस बात के बारे में संदिग्ध जानकारी मिल रही थी कि यह किस संस्करण में उपलब्ध था, इसलिए मैंने केवल वही शामिल किया जो मैं सत्यापित कर सकता था। –

संबंधित मुद्दे

 संबंधित मुद्दे