そのためにはハッシュを使用する必要があります。一意性が組み込まれており、チェックする必要さえありません。
次に例を示します。
my %seen;
while (my $line = <$fh>) {
if ($line =~ m/line (\d+)/) {
my $ln = $1;
if ( ! $seen{$ln}++ ) {
# this will check first and then increment. If it was encountered before,
# it will already contain a true value, and thus the block will be skipped.
# if it has not been encountered before, it will go into the block and...
# do various operations on the line number
}
}
}
%seen
エラーのあるすべての行と、1 行あたりの行数が含まれるようになりました。
print Dumper \%seen:
$VAR1 = {
10 => 1,
255 => 5,
1337 => 1,
}
これは、10 行目と 1337 行目に 1 つのエラーがあったことを示しています。これらはコードに応じて一意です。255 行目の 5 つのエラーは、ログに 5 回出現したため、一意ではありません。
それらのいくつかを取り除きたい場合は、delete
キーと値のペア全体を削除するか、デクリメントなどを使用して、1 行でデクリメントして取り除く$foo{$1}--
ようにします。delete $foo{$1} unless --$foo{$1}
編集:私はあなたのコードを見てきました。実際、欠けているのは正規表現と引用符だけです。実際に試してみましたか?できます。:)
my @RTarray;
while (my $line = <DATA>) {
$line =~ m/line (\d+)/;
print("Error occurs on line $1\n");
if( grep { $_ eq $1 } @RTarray ) { # this eq is the same as your regex, just faster
print("Not unique.\n");
} else {
print "Found a unique error in line $1!\n";
push @RTarray, $1;
}
}
__DATA__
RT Warning: No condition matches in 'unique case' statement. "/user/foo/project", line 218, for
RT Warning: No condition matches in 'unique case' statement. "/user/foo/project", line 3, for
RT Warning: No condition matches in 'unique case' statement. "/user/foo/project", line 44, for
RT Warning: No condition matches in 'unique case' statement. "/user/foo/project", line 218, for
RT Warning: No condition matches in 'unique case' statement. "/user/foo/project", line 7, for
RT Warning: No condition matches in 'unique case' statement. "/user/foo/project", line 7, for
RT Warning: No condition matches in 'unique case' statement. "/user/foo/project", line 7, for
これは印刷されます:
Error occurs on line 218
Found a unique error in line 218!
Error occurs on line 3
Found a unique error in line 3!
Error occurs on line 44
Found a unique error in line 44!
Error occurs on line 218
Not unique.
Error occurs on line 7
Found a unique error in line 7!
Error occurs on line 7
Not unique.
そして、これは正しいと思います。218 個のダブルと 7 個のトリプルがあり、両方が見つかりました。
引用符が欠落している文字列をファイルハンドルループに置き換えて、複数の行でテストしただけです。lineという単語が欠落している正規表現も修正しましたが、この特定のエラーメッセージには必要ありませんでした。