0

私はExpectPerlで1つのタスクを実行するために使用しています。コマンドを送信した後、成功したか失敗したかを示すファイルに印刷する必要があるかどうかに応じて、Successまたは出力として期待しています。ERROR

$exp->expect(30,
    '-re', "Success", printf LOG "Successfully Deleted \n" => sub {exp_last;},
    '-re', "ERROR",   printf LOG "Error in Deletion \n",
);

LOGファイルハンドルです。これを使用するSuccessと、コマンドの出力として取得してsendも、両方の正規表現が実行されます。私のログファイルでは、

Error in Deletion
Successfully Deleted

どうすればこれを解決できますか?

4

1 に答える 1

3

printfはリスト演算子です。最初のprintfは、あなたが言ったかのように、予想される残りの引数をすべて飲み込んでしまいます。

$exp->expect(30, '-re', "Success",
     printf( LOG "Successfully Deleted \n" =>
         sub {exp_last;},
         '-re',
         "ERROR",
         printf( LOG "Error in Deletion \n" )
     )
 );

したがって、成功の場合は、最初に削除でエラーを出力し、次に正常に削除されます。あなたはおそらく代わりに持っているべきです:

$exp->expect(30,
    '-re', "Success", printf( LOG "Successfully Deleted \n" => sub {exp_last;} ),
    '-re', "ERROR",   printf( LOG "Error in Deletion \n" ),
);

そこに印刷する代わりにprintfを使用する理由がないことを除いて。

更新:Expectのドキュメントを理解できる限り、それは複数のパターンを実行する方法ではありません。次のことを実行する必要があります。

my $which_pattern = $exp->expect(30, "Success", "ERROR");
if ($which_pattern) {
    if ($which_pattern == 1) {
        print LOG "Successfully Deleted \n";
    }
    else {
        print LOG "Error in Deletion \n";
    }
}

明示的な文字列の代わりに実際にパターンを使用している場合を除いて、-reは必要ありません。sub {exp_last;}あなたがビットで何を達成しようとしていたのか分かりません。

于 2010-07-26T10:00:21.120 に答える