2013-08-18 54 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