1

こんにちは、Perl を学んでいるので、ご容赦ください。私がやろうとしているのは、ログ ファイルに Failed、Error、または Skipped の文字列が 1 つ以上含まれている場合に、エラーを出力することです (ログには、配列内のすべての文字列の 1 つ以上または 1 つのインスタンスのみが含まれる可能性があります)。以下のコードのバリエーションを試しました。コンパイルされますが、Done のみが出力されます。

#!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl

my @matches = (
  qr/"Failed"/,
  qr/"Skipped"/,
  qr/"Error"/,
 );

$mylog = "email_log.txt";

open (LOG, "<$mylog") || die 'Could not OPEN $mylog file';

LOG_READER:
while (my $loglines = <$LOG>) {
  if ($loglines =~ /@matches/) { 
   print "Error in the log\n";
   last LOG_READER;
  }
}
close($LOG);

print "\n Test is Done \n";

私も試してみました

while ( $_ = <INPUT> ) {

  if( $_ =~ @matches ){
    print "\n Build Failed! \n";
  }
}

ご協力ありがとうございます 機能する変更されたコード このソリューションでは配列 #!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl を使用します

my @matches = qr/Failed | Skipped | Error/x;

my $mylog = "email_log.txt";

open (LOG, "<$mylog") || die 'Could not OPEN $mylog file';

LOG_READER:
while (my $loglines = <LOG>) {
  if ($loglines =~ /$matches/) { 
   print "Error in the log\n";
   last LOG_READER;
  }
}
close(LOG);

print "\n Test is Done \n";

この解決策は私が使用したものです
#!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl use warnings; 厳密に使用します。

my $myfailures = qr/Failed | Skipped | Error/x;
my $mylog = "email_log.txt";

open (LOG, "<$mylog") || die 'Could not OPEN $mylog file';

LOG_READER:
while (my $loglines = <LOG>) {
  if ($loglines =~ /$myfailures/) {
   print "Error in the log\n";
   last LOG_READER;
#    last;
  }
}

close(LOG);

print "\n Test is Done \n";

別の解決策 #!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl は警告を使用します。厳密に使用します。

my $mylog = "email_log.txt";

open (INPUT, "<$mylog") || die 'Could not OPEN $mylog file';

LOG_READER:
while(<INPUT>) {
    next unless /(Failed|Skipped|Error)/;
    print "\n Build failed \n";
    last;
}

close(INPUT);

print "\n Test is Done \n";

解決策 4

#!perl=C:\IBM\RationalSDLC\ClearCase\bin\perl
use warnings;
use strict;

my $matches = "Failed|Skipped|Error";
my $mylog = "email_log.txt"; 

open my $LOG, "<", $mylog|| die 'Could not OPEN $mylog file';

while (my $loglines = <$LOG>) {
    if ($loglines =~ /$matches/) { 
        print "\n Error in the log\n";
        last;
    }
}
close($LOG);

print "\n Test is Done \n";

貢献してくれた皆さんに感謝します。それらはすべてうまくいきました。私がみんなに正しい答えを与えることができればいいのにと思います。提供されたソリューションを使用して、すべてのバリエーションを機能させることができました。

4

4 に答える 4

4

if ($loglines =~ /@matches/) {

これはあなたの問題です。照合する正規表現として配列を使用することはできません。代わりにこれを試してください:

  if ($loglines =~ /"(Failed|Skipped|Error)"/) { 

while (my $loglines = <$LOG>) { ... close($LOG);

ああ、これはLOGドル記号なしである必要があります。

あなたと一緒use strict; use warnings;に、より良い診断が得られるでしょう。習慣に入る。

于 2013-05-20T21:34:29.870 に答える
2

あなたはこれをあまりにも複雑にしています。正規表現がどのように機能するかを読む必要があるだけですが、解決するのは非常に簡単な問題です。

while(<INPUT>) {
    next unless /"(Failed|Skipped|Error)"/;
    print "\n Build failed \n";
    last;
}
于 2013-05-20T21:33:25.127 に答える
1

正規表現の配列を使用できますが、この特定のケースでは必要ありません。

my $matches = qr/"Failed" | "Skipped" | "Error"/x;

その後

if ($loglines =~ /$matches/) { .. }
于 2013-05-20T21:34:15.377 に答える
1

初めに。私はいつも使用しますuse warnings; use strict;

openまた、3 引数のレキシカル スコープ バージョンを使用するように呼び出しを 変更します。

open my $fh, "<", $mylog; 

ここで正確に何を一致させようとしていますか?

my @matches = (
  qr/"Failed"/,
  qr/"Skipped"/,
  qr/"Error"/,
 );

ログファイルの例が役立ちます。実際の引用符で囲まれたこれらのキーワードを一致させようとしています。これはあなたが意図したものですか?

email_log.txt の例:

Your build "Failed"
"Skipping" foo.c

これは引用符の有無にかかわらず一致します:

my $matches = "Failed|Skipped|Error";
my $mylog = "email_log.txt";
open my $fh, "<", $mylog; 

while (my $loglines = <$fh>) {
    if ($loglines =~ /$matches/) { 
        print "Error in the log\n";
        last;
    }
}
close($fh);
于 2013-05-20T22:24:18.863 に答える