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警告您它没有成功退出,而不是使用 die 。它仍将继续执行脚本。

carp ("Did not exit command successfully!\n") if (! close ($fh) );
于 2012-09-03T06:45:32.003 回答
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 回答
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 回答