2009-09-14 9 views
8

निम्नलिखित पर्ल कोड में एक स्पष्ट अक्षमता है;क्या मैं पूरी फाइल को <> ऑपरेटर के साथ छोड़ सकता हूं?

while (<>) 
{ 
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;} 
... or do something useful 
} 

कोड उस फ़ाइल की प्रत्येक पंक्ति के माध्यम से कदम उठाएगा जिसे हम नहीं चाहते हैं।

फाइलों के आकार पर इस विशेष स्क्रिप्ट पर चल रहा है, यह ध्यान देने योग्य अंतर बनाने की संभावना नहीं है, लेकिन सीखने के लिए; मैं पूरी फाइल <> कैसे काम कर सकता हूं और काम कर रहा हूं?

इसका उद्देश्य इसलिए है क्योंकि यह स्क्रिप्ट फ़ाइल नाम में संस्करण संख्या वाले ऐप्स के पुराने संस्करणों को स्टोर करता है, मुझे केवल वर्तमान संस्करण में रूचि है।

उत्तर

15

grep ARGV पहले।

@ARGV = grep { $_ !~ /\d+\.\d+\.\d+/ } @ARGV; 

while (<>) 
{ 
    # do something with the other files 
} 
+0

आईसी, तुम बस की तरह आप किसी भी अन्य सूची होगा @ARGV फ़िल्टर करें। प्रासंगिक लिंक के लिए –

9

पॉल Roub के बारे में अधिक जानकारी के लिए answer काम करता है, The IO operators section of perlop man page देखते हैं। Grep का उपयोग करने के पैटर्न का उल्लेख <> से संबंधित कुछ अन्य चीजों के साथ किया गया है। जैसे ARGV::readonly के बारे में चीजों में से उल्लेख के

लें ध्यान दें:

perl dangerous.pl 'rm -rfv *|' 
+2

+1। –

19

पॉल Roub के समाधान सबसे अच्छा आप @ARGV फ़िल्टर कर सकते हैं, तो इससे पहले कि आप किसी भी फाइल पढ़ना शुरू है।

आप एक फ़ाइल को छोड़ के बाद आप इसे दोहराने के शुरू कर दिया है है, तो

while (<>) { 
    if (/# Skip the rest of this file/) { 
     close ARGV; 
     next; 
    } 
    print "$ARGV: $_"; 
} 
+0

अगर मैं कर सकता तो मैं भी इस उत्तर को स्वीकार करूंगा। –

+0

+ 1 'perl -pe'/'perl -ne' के लिए भी काम करता है। –

+0

मुझे यह पसंद है। इस प्रकार आप आसानी से कीवर्ड द्वारा निर्देशिका में फ़ाइलों को खोज सकते हैं: 'perl -E '@ ARGV = <"*">; जबकि (<>) {if (/ searchWord /) {$ ARGV कहें; बंद एआरजीवी;}} '' – eli

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