eval{
require $file;
}
/*subsequent code goes here*/
...
如果$file
包含exit
语句,则后续代码无法运行。
如何处理以便后续代码总是有机会在eval
完成时运行?
答案 0 :(得分:4)
无法中止exit
来电。 $file
应该使用die
,而eval
可以使用exit
。
作为解决方法,您可以全局覆盖BEGIN {
*CORE::GLOBAL::exit = sub { die "About to exit" }
}
内置:
{{1}}
答案 1 :(得分:1)
没有这样做,但你可以用你自己的函数重新定义perl的退出函数,它会对你的主代码知道的消息进行处理。如果我记得的话,你可以使用CORE :: exit()来获得真正的退出。
最好是在除main之外的包中运行新代码,这样就不会损坏main :: s exit。
2011年 - 2006年8月更新:对于咯咯笑,我试了一下:
my $code = qq[print qq(hello exit 99\n); exit 99;]; { package Foo; local $@; use vars qw(*exit); #required local *exit = sub { die "TRAPPED EXIT: @_\n"; }; #override local to package Foo; print "doing eval\n"; eval $code; print "reason=$@\n"; } print "done\n"; #prove we did not truly exit exit 2; #set specific exit code
是的,Safe.pm非常适合不受信任的代码,但如果代码是可信的,这就更容易了。
perl exit.pl; echo $? doing eval hello exit 99 reason=TRAPPED EXIT: 99 done 2
答案 2 :(得分:1)
查看Safe.pm
模块。它允许您限制可以执行的操作符。它适用于需要执行不受信任代码的情况。