16

大規模な Perl プログラムの一部としてdiff、フォルダ内の入力ファイルのコマンドの出力を参照ファイルと照合しています。空白の出力 (一致) は合格結果であり、diff からの出力はすべて不合格の結果です。

問題は、ターゲット フォルダーで予想されるファイル数が不足している場合、diff がスローする例外が出力として表示されず、誤ったパスが作成されることです。

出力例:

diff: /testfolder/Test-02/test-output.2: No such file or directory

テスト-01: 合格

テスト-02: 合格

コードは次のようになります。

$command = "(diff call on 2 files)";
my @output = `$command`;
print "Test-02: ";
$toPrint = "PASS";
foreach my $x (@output) {
    if ($x =~ /./) {
        $toPrint = "FAIL";
    }
}

これは、呼び出しからの出力がある場合に失敗する簡単なハッカー ジョブdiffです。で呼び出されたコマンドによってスローされた例外を確認する方法はありbackticksますか?

4

7 に答える 7

17

プログラム自体は「例外」をスローすることはできませんが、ゼロ以外のエラー コードを返すことはできます。system()$? を使用して、バッククォートまたは Perl で実行されたプログラムのエラー コードを確認できます。

$toPrint = "FAIL" if $?;

(テストするループの前にこの行を追加します@output。)

于 2009-04-22T14:43:30.450 に答える
5

$ のperlvarをチェックしますか? . 0 に設定されている場合、シグナルはなく、プログラムからの戻りコードもゼロです。それはおそらくあなたが望むものです。

この場合、 stdout と stderr を /dev/null にリダイレクトしながら、 systemを使用してその戻り値がゼロであることを確認することもできます。

于 2009-04-22T14:42:53.637 に答える
4

diffエラーがSTDERRで発生すると仮定して、エラーを調べたりログに記録したりしたい場合は、CPANモジュールCapture :: Tiny:をお勧めします。

use Capture::Tiny 'capture';
my ($out, $err) = capture { system($command) };

これはバックティックに似ていますが、STDOUTとSTDERRを別々に提供します。

于 2009-04-22T16:13:29.690 に答える
1

perldoc サイトには、バッククォートで囲まれたコマンドの出力を処理する興味深い方法のリストがあります。下にスクロールするか、「qx/STRING/」を検索する必要があります (引用符なし)。

于 2009-04-22T14:50:27.033 に答える
0

また、コードを読みやすくする「diff -d」の出力を実行することもできます。

foreach (`diff -d $args`){
  if (/^Only in/){
     do_whatever();
  }
}
于 2009-04-22T15:20:35.900 に答える
0

あなたもすることができます:

my @output = `$command 2>\&1`;
于 2009-04-22T15:23:49.467 に答える