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";
}
超级会员免费看
订阅专栏 解锁全文
852

被折叠的 条评论
为什么被折叠?



