2013-10-04 3 views
6

मैं वर्तमान में एक फ़ाइल ARGV के माध्यम से क्रम में लिया खोलने हूँ:मैं एआरजीवी के माध्यम से जिस फ़ाइल के साथ काम कर रहा हूं उसकी लाइन संख्या कैसे प्रिंट करूं?

File.open(ARGV[0]) do |f| 
    f.each_line do |line| 

एक बार मिलान हो जाता है मैं उपयोगकर्ता के लिए उत्पादन मुद्रित करें।

if line.match(/(strcpy)/i) 
    puts "[!] strcpy does not check for buffer overflows when copying to destination." 
    puts "[!] Consider using strncpy or strlcpy (warning, strncpy is easily misused)." 
    puts " #{line}" 
end 

मुझे पता है कि (argv [0]) फ़ाइल में मिलान लाइन के लिए लाइन नंबर का प्रिंट आउट के लिए कैसे करना चाहते हैं।

print __LINE__ का उपयोग रूबी लिपि से लाइन नंबर दिखाता है। मैंने print __LINE__ के #{line} के विभिन्न स्ट्रिंग इंटरपोलेशन के साथ सफलता के बिना कई अलग-अलग बदलावों की कोशिश की है। क्या कोई तरीका है कि मैं फ़ाइल से लाइन नंबर प्रिंट कर सकता हूं?

उत्तर

9

जब रूबी की आईओ कक्षा एक फ़ाइल खोलती है, तो यह $. वैश्विक चर 0 को सेट करती है। प्रत्येक पंक्ति जो पढ़ने के लिए वैरिएबल बढ़ जाती है। तो, यह जानने के लिए कि कौन सी रेखा पढ़ी गई है, बस $. का उपयोग करें।

$. याके लिए English मॉड्यूल में देखें।

हम lineno विधि का भी उपयोग कर सकते हैं जो आईओ कक्षा का हिस्सा है। मुझे लगता है कि थोड़ा और गड़बड़ है क्योंकि हमें उस पर ध्यान देने के लिए आईओ स्ट्रीम ऑब्जेक्ट की आवश्यकता है, जबकि $. हमेशा काम करेगा।

मैं पाश अधिक बस लिखना चाहते हैं: के बारे में सोचने के लिए है

File.foreach(ARGV[0]) do |line| 

कुछ यदि आप एक * nix सिस्टम पर हैं, तो आप उपयोग कर सकते हैं ओएस बहुत करने के लिए निर्मित grep या fgrep उपकरण अपनी प्रसंस्करण तेज करें। अनुप्रयोगों के "grep" परिवार को आप जो चाहते हैं उसे करने के लिए अत्यधिक अनुकूलित किए जाते हैं, और सभी घटनाएं पा सकते हैं, केवल पहले, नियमित अभिव्यक्तियों या निश्चित तारों का उपयोग कर सकते हैं, और आसानी से रूबी के %x या बैकटिक ऑपरेटरों का उपयोग करके कॉल किया जा सकता है।

puts `grep -inm1 abacus /usr/share/dict/words` 

आउटपुट कौन सा:

34:abacus 

-inm1 का अर्थ है "चरित्र-मामले को अनदेखा करें", "उत्पादन लाइन नंबर",

+0

कि महान काम किया "पहली घटना के बाद रोक"! टिन मैन की मदद के लिए धन्यवाद। मुझे अंग्रेजी मॉड्यूल से अवगत नहीं था;) – nanotechz9l

+0

यूप मैंने अतीत में grep का उपयोग किया है लेकिन उस उद्देश्य के लिए नहीं, मैं इसे देख लूंगा। लूप को कम करने के लिए भी धन्यवाद। बहुत अच्छा लगता है! – nanotechz9l

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

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