2013-08-18 84 views
2

是否存在的等效以下 -阻止eval的替代方案?

eval { die "reason 1"; }; warn [email protected] if [email protected]; 
eval { die "reason 2"; }; warn [email protected] if [email protected]; 
eval { die "reason 3"; }; warn [email protected] if [email protected]; 
. 
. 

正如你可以看到,下面的代码不会打印出每一个可能的原因脚本死..

eval { 
    die "reason 1"; 
    die "reason 2"; 
    die "reason 3"; 
}; 
warn [email protected] if [email protected]; 

[编辑]我想想知道脚本(使用很多库的脚本)可能会失败的所有可能的原因。死亡陈述不在我可以编辑的地方。

+0

难道你只是想'警告'?或者你想测试一下库中的失败模式?阅读源代码可以在那里更好地工作。我不太确定你想要完成什么。 – amon

+0

后者。我想知道所有可能的原因(使用很多库的脚本)可能会失败。死亡陈述不在我可以编辑的地方。 – trinity

回答

2

重写芯片是不完全对eval替代,但是这是我想你问一下,俘获芯片和把它变成一个警告,记录死亡和恢复/继续计划

$ 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; 
+0

正是我想找的,谢谢!有些地方这不会工作,虽然 - 一些库使用Internals :: SvREADONLY导致脚本死亡。但是这个问题超出了这个问题的范围,因为它会涉及我深入perl内部模块的未知领域。 – trinity

+1

此外,虽然你在这里,你能解释我们为什么需要unless ($^S)。我在这里读到它的含义 - http://www.catonmat.net/download/perl.predefined.variables.pdf - 这是否意味着这将跳过死亡内部evals? – trinity

+0

它会跳过警告内部evals - 它有用的知道,如果你可能需要它 – optional

0

你的意思是这样的吗?

my $problems; 
for my $r (1 .. 3) { 
    eval { die "reason $r"; 1 } or $problems .= [email protected]; 
} 

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

嗨,我想找出脚本可能失败的各种原因。不,这不是我正在寻找的。我可能会更新这个问题来反映这一点! – trinity

+0

@trinity:它与你的问题无关。它也应该可以工作。 – choroba