2

さて、ファイルを読み込み、各行を調べて、文字列 ERROR がある場所を見つける必要があります。これは私がこれまでに持っているものです:

open(LOGFILE, "input.txt") or die "Can't find file";

$title = <LOGFILE>;

$\=' ' ;
while (<>){
    foreach $title(split){
        while (/^ERROR/gm){
            print "ERROR in line $.\n";
        }
    }
}
close LOGFILE;

私が抱えている問題は、各行の最初の単語しか見ていないことです。したがって、入力が

ブーファーエラー

エラーを登録しません。どんな助けでも大歓迎です!私はperlを初めて使用するので、基本的なことを試してみてください。ありがとう!

4

2 に答える 2

6

これはよりエレガントなアプローチであり、正規表現の問題を修正しました。^行の先頭に一致しました。

open(LOGFILE, "input.txt") or die "Can't find file";

while(<LOGFILE>) {
   print "ERROR in line $.\n" if(/ERROR/);
}
close LOGFILE;

または、コマンドラインからはどうですか:

perl -n -e 'print "ERROR in line $.\n" if(/ERROR/);' input.txt

-nすべての入力行に対して暗黙的にループする -eコード行を実行する

ファイルに出力するには:

perl -n -e 'print "ERROR in line $.\n" if(/ERROR/);' input.txt > output.txt

これは Perl を使用する良い/単純な例ですが、Unix シェルを使用している場合、grepはスクリプトを必要とせずに必要なことを実行します (OP コメントの TLP のおかげです)。

grep -n ERROR input.txt > output.txt

これは、実際には一致する行自体を行番号とともに出力します。

于 2012-06-06T15:05:12.790 に答える
1

もちろん、正規表現の前の^は「行の開始」を意味するため、そうではありません。それを削除すると、どこでもエラーが発生します。分割のトリックもすべきではありません。どこかでエラーを見つける必要がありますか?次に、そのように記述します。

while (<>){
   if (/ERROR/){
      print "ERROR in line $.\n";
   }
}
于 2012-06-06T15:03:28.150 に答える