2

是否有以下等效项-

eval { die "reason 1"; }; warn $@ if $@;
eval { die "reason 2"; }; warn $@ if $@;
eval { die "reason 3"; }; warn $@ if $@;
.
.

如您所见,以下代码不会打印出脚本死机的所有可能原因。

eval {
    die "reason 1";
    die "reason 2";
    die "reason 3";
};
warn $@ if $@;

[编辑] 我想知道脚本(使用很多库)可能失败的所有可能原因。模具声明不在我可以编辑的地方。

4

2 回答 2

2

覆盖 die 并不完全是 eval 的替代方案,但我认为这就是你要问的问题,捕获 die 并将其变成警告、记录 die 和恢复/继续程序

$ perl -e " eval{die 1;}; die 2; die 3; "
2 at -e line 1.

$ perl -Mwarnerous  -e " eval{die 1;}; die 2; die 3; "
FAKE die : 2 at -e line 1
FAKE die : 3 at -e line 1

$ cat warnerous.pm
*CORE::GLOBAL::die = sub {
    unless( $^S ){
        warn( qq{FAKE die : @_ @{[sprintf q{at %s line %s },(caller)[1,2] ]}\n} );
    }
};
1;
于 2013-08-18T15:06:00.873 回答
0

你的意思是这样的吗?

my $problems;
for my $r (1 .. 3) {
    eval { die "reason $r"; 1 } or $problems .= $@;
}

warn "There were the following problems:\n$problems";
于 2013-08-18T14:28:12.780 回答