2009-09-14 19 views
8

下面的Perl代碼有明顯的低效率;我可以使用<>運算符跳過整個文件嗎?

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

IC,你只是過濾@ARGV就像使用其他任何名單。 – 2009-09-14 16:31:42

19

保羅Roub的解決方案是最好的,如果你可以過濾@ARGV你開始閱讀任何文件之前。

如果你跳過一個文件,你已經開始迭代之後,

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

如果可以的話,我也會接受這個答案。 – 2009-09-15 07:55:19

+0

+ 1也適用於'perl -pe' /'perl -ne'。 – 2014-11-25 17:09:41

+0

我喜歡這個。通過這種方式,您可以通過關鍵字輕鬆搜索目錄中的文件: 'perl -E'@ ARGV = <"*">; while(<>){if(/ searchingWord /){say $ ARGV;關閉ARGV;}}'' – eli 2017-09-12 12:00:49

相關問題