1

ファイルを開くための入力として使用されるコマンドを使用する次のコードがあります。

コマンド $cmd がゼロ以外の終了ステータスを返すと、スクリプトが終了します。私はまだそれを続けて、スクリプトの残りのことをしたい

$cmd = 'ps -u psharma';
open( my $fh, "-|",$cmd ) || die( "$cmd failed: $!" );
my @lines = <$fh>;
close($fh) || die $! ? "Close for $cmd failed: $!" : "Exit status $? from command $cmd";
4

4 に答える 4

1

ダイを使用する代わりに、Carpを使用して、正常に終了しなかったことを警告してみてください。それでもスクリプトは続行されます。

carp ("Did not exit command successfully!\n") if (! close ($fh) );
于 2012-09-03T06:45:32.003 に答える
0

これがスクリプト全体である場合、cmdの実行がゼロ以外を返した場合、スクリプトは最後の行で終了します。このコードを超えて実行を継続したい場合は、最後の行でdieを削除するべきではありませんか?

于 2012-09-03T06:34:55.317 に答える
0

次のように、すべてをブロックでラップしeval、「マジック変数」を確認$@できます。

use strict; #always
use warnings; #always

my $cmd = 'ps -u psharma';

my $fh; #defining outside the scope of the eval block
my @lines; #ditto

eval {
    open $fh, "-|", $cmd 
        or die "$cmd failed: $!";

    @lines = <$fh>;
    close $fh
        or die $!
               ? "Close for $cmd failed: $!"
               : "Exit status $? from command $cmd";
}

if($@) {

    warn "Something bad happened: $@\n";
}
#If you made it here with no warning, then everything's okay.

Try::Tinyまた、基本的なtry/catch/finallyブロックを可能にする をチェックアウトすることもできます。

于 2012-09-03T06:44:11.343 に答える
0
close($fh) || die $! ? "Close for $cmd failed: $!" : "Exit status $? from command $cmd";

このコードはすでに $!/$? をチェックしています。(errno/$cmd 終了ステータス)。dieしたがって、さらに深く移動できます。

close($fh) || $! 
    ? die "Close for $cmd failed: $!" 
    : warn "Exit status $? from command $cmd";

ただし、ここでは明示的な方が読みやすいと思いifます。

于 2012-09-03T08:30:56.463 に答える