Perl 阻止评估的替代方案?

Perl 阻止评估的替代方案?,perl,try-catch,eval,die,Perl,Try Catch,Eval,Die,是否存在以下等效项- 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

是否存在以下等效项-

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 $@;

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

你是说这样的吗

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

warn "There were the following problems:\n$problems";

覆盖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;

难道你不想发出警告吗?还是要从库中测试故障模式?在那里阅读资料可能会更好。我不太清楚你想完成什么。后者。我想知道脚本(使用了很多库)失败的所有可能原因。die语句不在我可以编辑的地方。嗨,我想找出脚本失败的各种原因。。不,这不是我要找的。我可能会更新问题以反映这一点@崔妮蒂:这与你的问题无关。它也应该有用。正是我想要的,谢谢!!但是,在某些地方,这是行不通的——一些库使用内部构件::SvREADONLY,这会导致脚本死亡。但这超出了这个问题的范围,因为这将涉及到我对perl内部模块未知领域的挖掘。另外,在这里,您能解释一下为什么我们需要
,除非($^S)
。我在这里通读了它的意思--这是否意味着它将跳过evals内的die?它将跳过die-s内evals的警告--知道它很有用,以防您需要它