Perl编程:Eval、模块与异常处理全解析
1. 使用Eval实现超时控制
在Perl中调用 eval
时,它会记录下接下来要执行的语句,以防在执行过程中调用了 die
。 die
内部会调用 longjmp
,这使得无论调用栈有多深,Perl都能立即将控制权转移到 eval
之后的语句,并且 eval
代码块中创建的所有临时和局部变量都会被自动垃圾回收。
这种内部使用 setjmp
和 longjmp
的机制为我们带来了一种新的技术,即中止阻塞的系统调用和无限循环。例如,我们希望最多等待10秒让用户输入内容,使用 $buf = <>
会使程序阻塞,直到用户按下回车键。为了实现超时功能,可以使用内置的 alarm()
函数在指定秒数后生成 ALRM
信号,示例代码如下:
$SIG{ALRM} = \&timed_out;
alarm(10); # Tells the OS to issue an ALRM signal after 10 seconds
$buf = <>; # Go into a blocking read
sub timed_out {
die "GOT TIRED OF WAITING";
}