0

以下のようなテキストファイルの内容があります。

 Starting log...
    Sample at 10000000
    Mode is set to 0
    0007F43: CHANGE DETECTED at  290313 line 0 from 00 to 04
    0007F46: Mismatched at 290316 line 0
    0007F50: Matched occur at 290326 line 1
    0007F53: Mismatched at 290336 line 2
    0007F56: Matched occur at 290346 line 0
    0007F60: Mismatched at 290356 line 2
    0007F63: Matched occur at 290366 line 0
    Saving log....
    DONE!!!

「Mismatched」を含む行の値を取得するために、以下のように単純な perl プログラムを実行しています。

#!/usr/bin/perl

print "Starting perl script\n\n";
open (LOG,"dump.log");

while (<LOG>) {
 next if !/Mismatched/;
 /at\s+"([^"]+)"/;
 print $1,"\n";
}
close(LOG);
print "DONE!!\n";
exit;

しかし、次のようなエラー メッセージが表示されます。コーディングの何が問題なのかを知ることができますか? chomp() に関連するものを見逃していますか?

Use of uninitialized value in print at test.pl line 9, <LOG> line 5.
Use of uninitialized value in print at test.pl line 9, <LOG> line 7.
Use of uninitialized value in print at test.pl line 9, <LOG> line 9.
DONE!!

そして..より単純なスクリプトを使用してキーワード「Mismatched」を検索した後、整数 (つまり 290316) を取得するための提案はありますか? 最初の値だけを取得したい..

4

4 に答える 4

2

$1 is getting printed even if it does not have anything. It should be in a condition:

print $1,"\n" if (/Mismatched at (\d+)/);

To store all values in an array:

push @arr,$1 if (/Mismatched at (\d+)/);
于 2013-04-03T07:11:51.037 に答える
1

正規表現を次のように変更します。

/at\s+(\d+)/;
于 2013-04-03T07:15:20.710 に答える
0

スクリプトを変更して、よりモダンな perl スタイルを実装します。

#!/usr/bin/perl

use strict;
use warnings;

print "Starting perl script\n\n";
open my $LOG, '<', 'dump.log' or die $!;

while( <$LOG> ) {
  print "$1\n" if /Mismatched at (\d+)/;
}
close $LOG;
print "DONE!!\n";
于 2013-04-03T12:24:29.963 に答える