2009-09-14 15 views
8

次のPerlコードは明らかに非効率的です。<>演算子でファイル全体をスキップできますか?

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

コードは、不要と思われるファイルのすべての行を処理します。

この特定のスクリプトがこれで実行しているファイルのサイズでは、目立った違いはありませんが、学習のためです。ファイル<>をすべて破棄して、次のファイルに移動するにはどうしたらいいですか?

これは、このスクリプトが実行されているときにファイル名にバージョン番号の古いバージョンのアプリケーションが保存されているためです。私は現在のバージョンのみに興味があります。

答えて

15

grep ARGV first。詳細については、

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

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

IC、あなたはちょうどあなたが他のリストを希望のように@ARGVフィルタリング。関連するリンクについては –

9

ポールRoubのanswer作品は、The IO operators section of perlop man pageを参照してください。 grepを使用するパターンに加えて、<>に関連するいくつかのものが挙げられます。以下のようなARGV::readonlyに関する事柄への言及の

をメモ:あなたはすべてのファイルの読み込みを開始する前に、あなたが@ARGVをフィルタリングすることができた場合

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

+1。 –

19

ポールRoubのソリューションが最適です。

あなたは、あなたがそれを反復開始した後、ファイルをスキップする必要がある場合は、

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

できればこの回答も受け入れます。 –

+0

+ 1 'perl -pe' /' perl -ne'でも動作します。 –

+0

私はこれが好きです。この方法で、キーワードでディレクトリ内のファイルを簡単に検索することができます: 'perl -E '@ ARGV = <"*">; while(<>){if(/ searchedWord /){$ ARGV; close ARGV;}} '' – eli

関連する問題