2013-08-18 2 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]; 

[EDIT] Я бы как знать все возможные причины, сценарий (который использует много много библиотек) может потерпеть неудачу. Утверждения умирают не в месте, которое я могу редактировать.

+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 Internals. – 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