我正在尝试做这样的事情
$SIG{ALRM} = sub {
print $line_number_when_alarm_went_off;
};
alarm 10;
# rest of the script
我使用ALRM
作为示例,我将最终使用不同的信号从外部杀死以触发它。有没有一种巧妙的方法来进行这种操作?
我有一些缓慢的脚本,有时我想向他们发送一个信号,以了解当时代码的位置。
我希望尽可能不引人注目,这样我就可以将其打包并添加到遗留代码中。
答案 0 :(得分:7)
您可以在列表上下文中使用caller
来获取当前子调用的位置的包,文件和行号。
$SIG{ALRM} = sub {
my ($pkg, $file, $line) = caller;
CORE::say $line;
die;
};
alarm 2;
while (1) {
1;
}
这将输出11
(如果我计算正确,在我的文件中它是1740,而$SIG
行是1730。
它也可以与其他信号处理程序一起使用,例如warn
。
$SIG{__WARN__} = sub {
my ($pkg, $file, $line) = caller;
CORE::say $line;
};
warn 'foo';
这将输出7
请注意,您的代码存在语法错误。您正在将哈希引用指定为信号处理程序,不是子引用!