0

エラー コードを分析し、それらが一意かどうかを判断するための perl スクリプトを作成しています。エラーは、それがどの行にあるかによって異なります。標準エラー メッセージは次のようになります。

RT Warning: No condition matches in 'unique case' statement.
    "/user/foo/project", line 218, for ..

これらのエラー メッセージの多くには、取得している文字列に複数の数字が含まれています。したがって、私ができるようにしたいのは、「行」という単語の後に最初に出現する数値を取得し、その値が配列に存在しない場合にのみ配列に追加することです。ここに私がこれまでに持っているものがあります:

my $path = RT Warning: No condition matches in 'unique case' statement.
    "/user/foo/project", line 218
$path =~ m/(\d+)/;
print("Error occurs on line $1\n"); 
if(grep(/^$1$/, @RTarray))
{
    print("Not unique.\n");
}
else
{
    push(@RTarray, $1); 
    print("Found a unique error!\n");
}

したがって、明らかに、キーワード「行」の後にあるかどうかを確認していないため、現在正規表現をどのように処理しているかに基づいて、それを行う方法がよくわかりません。さらに、配列に要素を正しく追加しているとは思いません。助けてください!

4

1 に答える 1

2

そのためにはハッシュを使用する必要があります。一意性が組み込まれており、チェックする必要さえありません。

次に例を示します。

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という単語が欠落している正規表現も修正しましたが、この特定のエラーメッセージには必要ありませんでした。

于 2013-05-22T16:23:59.097 に答える