Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी के साथ अपने कमांड-लाइन-फू का स्तर बढ़ाएं

कमांड लाइन में वास्तव में महारत हासिल करने के लिए आपको दर्जनों - यदि सैकड़ों नहीं - छोटे उपयोगिता कार्यक्रमों में महारत हासिल करनी होगी। इनमें से प्रत्येक चीजों को थोड़ा अलग तरीके से करता है। यह काफी जबरदस्त हो सकता है।

सौभाग्य से, इनमें से बहुत से एकल-उद्देश्य वाले टूल को रूबी जैसी सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा से बदलना संभव है। इस तरह आप रूबी ज्ञान का उपयोग कर सकते हैं जो आपको पहले से ही अपने कमांड-लाइन-फू को स्तरित करना है।

यह पोस्ट आपको रूबी को कमांड-लाइन स्विस आर्मी नाइफ के रूप में उपयोग करने के मूल सिद्धांतों के माध्यम से ले जाएगा। मैं चतुर वन-लाइनर्स के साथ आप पर बमबारी नहीं करने जा रहा हूं। इसके बजाय हम देखेंगे कि चीजें वास्तव में कैसे काम करती हैं, ताकि उम्मीद है कि आप अपनी समस्याओं को हल करने के लिए इन तकनीकों को लागू करने में सक्षम होंगे।

कमांड लाइन से रूबी का उपयोग करना

मुझे यकीन है कि आप जानते हैं कि आप रूबी प्रोग्राम को कमांड लाइन से इस तरह चला सकते हैं:

$ ruby myprogram.rb

लेकिन क्या आप जानते हैं कि रूबी द्वारा निष्पादित किए जाने वाले कोड में आप पाइप कर सकते हैं?

$ echo "puts 2+2" | ruby
4

कमांड-लाइन तर्क के रूप में कोड में पास करने की क्षमता और भी अधिक उपयोगी है। आज हम इसी पर अपना समय बिताने जा रहे हैं।

$ ruby -e 'puts 2+2'
4

अरे न्यूबीज

क्या उपरोक्त उदाहरण भ्रमित करने वाले हैं? ऐसा इसलिए हो सकता है क्योंकि आप पाइप और पुनर्निर्देशन से परिचित नहीं हैं। एक अच्छे परिचय के लिए इस पोस्ट को देखें। हम बहुत नीचे पाइप का उपयोग करने जा रहे हैं।

इनपुट के साथ कार्य करना

अधिकांश कमांड-लाइन टूल कुछ डेटा लेते हैं, इसे संसाधित करते हैं, और फिर इसे वापस थूक देते हैं।

इनपुट प्राप्त करने के लिए हमारे पास दो अच्छे विकल्प हैं:कमांड लाइन तर्क और एसटीडीआईएन। आइए उनमें से प्रत्येक पर एक नज़र डालें।

कमांड-लाइन तर्क

आप अपनी स्क्रिप्ट को जितने चाहें उतने कमांड-लाइन तर्क भेज सकते हैं। बस उन्हें बाकी सब के बाद रखें:

$ ruby -e '<your code here>' arg1 arg2 arg3 etc

ये तर्क ARGV . के अंदर संग्रहीत हैं सरणी। नीचे दिए गए उदाहरण में मैं पूरी सरणी को डंप कर रहा हूं ताकि आप देख सकें कि इसमें क्या है।

$ ruby -e 'puts ARGV.inspect' apples bananas pears oranges
["apples", "bananas", "pears", "oranges"]

यह ध्यान देने योग्य है कि रूबी हमेशा ऐसा ही व्यवहार करती है। कोई जादू नहीं हो रहा है क्योंकि हम कमांड लाइन का उपयोग कर रहे हैं। अधिक जानकारी के लिए एआरजीवी के बारे में यह पोस्ट देखें।

गूंगा उदाहरण

एक पल के लिए कल्पना कीजिए कि मैं अति अहंकारी हूं। मेरे लिए सबसे महत्वपूर्ण बात यह जानना है कि वेब पर मेरे नाम का कितनी बार उल्लेख किया गया है। हमने जिन तकनीकों को देखा है, उनका उपयोग करके मैं किसी भी वेबपेज के लिए इसकी गणना करने के लिए आसानी से एक लाइनर लिख सकता हूं।

$ ruby -e "require 'open-uri'; puts open(ARGV.first).read.scan(/starr/i).count" <url here>

STDIN

कमांड-लाइन तर्क महान हैं, लेकिन वे केवल छोटे मानों के लिए अच्छे हैं। आप मोबी डिक के संक्षिप्त पाठ को इनपुट करने के लिए उनका उपयोग नहीं करना चाहेंगे। उसके लिए हम STDIN का उपयोग करना चाहते हैं।

यदि आप एसटीडीआईएन से परिचित नहीं हैं, तो भयभीत न हों। यहां हमारे उद्देश्यों के लिए यह पढ़ने के लिए खुली किसी भी अन्य फ़ाइल की तरह ही व्यवहार करता है।

यहाँ मेरा मतलब है। नीचे दिए गए उदाहरण में हम रूबी में कुछ टेक्स्ट डाल रहे हैं। हमारी रूबी स्क्रिप्ट इसे एसटीडीआईएन से पढ़ रही है और स्क्रीन पर प्रिंट कर रही है।

echo "bananas!" | ruby -e "puts STDIN.read"
bananas!

हम cat . का उपयोग करके आसानी से बड़ी मात्रा में डेटा इनपुट कर सकते हैं . नीचे दिया गया उदाहरण first . का उपयोग करता है पाठ की पहली कुछ पंक्तियों को हथियाने के लिए किसी भी फ़ाइल पर उपलब्ध विधि:

cat moby.txt | ruby -e "puts STDIN.first(3)"
Call me Ishmael. Some years ago--never mind how long precisely--having
little or no money in my purse, and nothing particular to interest me on
shore, I thought I would sail about a little and see the watery part of

गूंगा उदाहरण

अब जब हम जानते हैं कि एसटीडीआईएन का उपभोग कैसे किया जाता है, तो आइए ऊपर से गूंगा उदाहरण फिर से लिखें। वेबपेज लाने के लिए रूबी का उपयोग करने के बजाय, हम curl . का उपयोग कर सकते हैं और पैटर्न मिलान के लिए केवल रूबी का उपयोग करें।

curl <MY URL> | ruby -e "puts STDIN.read.scan(/starr/i).size"

सिंटेक्टिक शुगर के साथ STDIN!

जब आप एसटीडीआईएन के साथ काम कर रहे हों, तो इनपुट की प्रत्येक पंक्ति पर लूप करना बहुत आम है। कल्पना कीजिए कि मैं निर्देशिका में प्रत्येक फ़ाइल के लिए फ़ाइल एक्सटेंशन प्राप्त करना चाहता हूं। यहां बताया गया है कि मैं सामान्य एसटीडीआईएन लूप का उपयोग करके ऐसा कैसे कर सकता हूं:

ls | ruby -e 'STDIN.each_line { |l| puts l.split(".").last }'
rb
rb
csv

चूंकि एसटीडीआईएन लूप इतना सामान्य है, रूबी एक शॉर्टहैंड प्रदान करता है। अगर हम अपनी स्क्रिप्ट को -n . के साथ चलाते हैं ध्वज, रूबी स्वचालित रूप से एसटीडीआईएन में प्रत्येक पंक्ति पर लूप करेगी। वर्तमान लाइन वैश्विक चर $_ . में है ।

तो हम ऊपर दिए गए उदाहरण को इस तरह फिर से लिख सकते हैं:

ls | ruby -n -e 'puts $_.split(".").last'

यह आप पर निर्भर करता है कि आप आशुलिपि का उपयोग करना चाहते हैं या नहीं। हालांकि इसका निश्चित रूप से मतलब है कि आपको कम कोड लिखना है, इसका मतलब यह भी है कि आपको -n जैसे अधिक मनमाने तथ्यों को याद रखना होगा। और $_ .

आउटपुट के साथ कार्य करना

ऐसी स्थितियों में आप आमतौर पर STDOUT को अपना आउटपुट लिखना चाहेंगे। यह आपको सबसे अधिक लचीलापन देगा क्योंकि यह आपको आउटपुट को अन्य कार्यक्रमों में पाइप करने देगा या आवश्यकतानुसार डिस्क पर पुनर्निर्देशित करेगा।

अच्छी खबर यह है कि आपको उसी प्रिंट कमांड का उपयोग करने को मिलता है जिससे आप शायद बहुत परिचित हैं। हालांकि एक बात जो ध्यान रखनी चाहिए वह यह है कि puts एक नई लाइन जोड़ता है, जो आप चाहते हैं या नहीं हो सकता है।

puts "hello world" # sends "hello world\n" to STDOUT
print "hello world" # doesn't add a newline"

सब को एक साथ रखना

हनीबैगर अमेरिका के वाशिंगटन राज्य में स्थित है। इसका मतलब है कि हमारे पास हर भुगतान करने वाले ग्राहक के लिए बिक्री कर का भुगतान करने का विशेषाधिकार है जो कि वाशिंगटन में भी रहता है।

मैंने इसे काफी सरल बना दिया है, लेकिन हमारे पास मूल रूप से वर्ष के लिए प्रत्येक लेनदेन के साथ एक CSV फ़ाइल है। यह कुछ इस तरह दिखता है:

1/1/2015,100.00,WA
1/1/2015,50.00,NY

तो वाशिंगटन में सभी लेनदेन के लिए त्वरित राशि प्राप्त करने के लिए मैं इस तरह एक-लाइनर का उपयोग कर सकता हूं:

$ cat cc.csv | ruby -e 'puts STDIN.inject(0) { |sum, x| date, amount, state = x.split(","); state.strip == "WA" ? sum + amount.to_f : sum  }'

ध्यान रखें कि सीएसवी फाइलों को पार्स करने का यह एक बहुत ही खराब तरीका है। मैं इस कोड को जंगली में कभी नहीं भेजूंगा। लेकिन एकमुश्त समस्याओं को हल करने के लिए छोटे छोटे कार्यक्रमों को लिखने की खुशी में से एक यह है कि आप सभी किनारे के मामलों को अनदेखा कर देते हैं। मैं यहाँ यही करने जा रहा हूँ।


  1. टीसीमॉलोक के साथ रूबी की मेमोरी आवंटन की रूपरेखा

    रूबी में मेमोरी आवंटन कैसे काम करता है? रूबी को मेमोरी टुकड़ों में मिलती है, जिन्हें पेज कहा जाता है, यहां नई वस्तुएं सहेजी जाती हैं। फिर… जब ये पृष्ठ भर जाते हैं, तो अधिक स्मृति की आवश्यकता होती है। रूबी ऑपरेटिंग सिस्टम से malloc . के साथ अधिक मेमोरी का अनुरोध करती है समारोह। यह malloc फ़ंक्श

  1. रूबी के साथ एक पार्सर कैसे बनाएं

    पार्सिंग स्ट्रिंग्स के एक गुच्छा को समझने और उन्हें किसी ऐसी चीज़ में बदलने की कला है जिसे हम समझ सकते हैं। आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं, लेकिन वे हमेशा कार्य के लिए उपयुक्त नहीं होते हैं। उदाहरण के लिए, यह सामान्य ज्ञान है कि नियमित अभिव्यक्तियों के साथ HTML को पार्स करना शायद एक अच्छ

  1. आईडी वॉचडॉग से अपनी पहचान सुरक्षित रखें

    वे कौन हैं आईडी वॉचडॉग ने बाजार में पिछले 13 वर्षों से अपना अस्तित्व साबित कर दिया है जिससे पहचान की चोरी हमेशा असंभव हो जाती है। श्री क्रेग रामसे ने जून 2005 में डेनवर, कोलोराडो में स्थित क्रेडिट पेशेवर के एक समूह के साथ इस कंपनी की स्थापना की और पहचान की चोरी संरक्षण सेवाओं में देश की अग्रणी शीर्