简短版本:我正在尝试将参数传递给信号处理程序。但是,当我这样做时,处理程序会在程序启动后立即运行。为什么会发生这种情况,我该如何纠正呢?
详细信息:我的代码中有以下行:$SIG{ALRM} = \×up($number);
。信号处理程序本身是:
sub timesup {
my $num = shift;
die "Time ran out.\nNumber was: $num\n"
}
当我运行程序时,它会立即运行信号处理程序并使用指定的消息终止。我通过在$SIG{ALRM}
行之前生成$ number的随机值进行测试。关于死亡的天鹅歌曲消息确实打印了随机值,所以我认为论证本身正在正确传递。但输出是立竿见影的:
bassoon:$ ./myscript.pl
Time ran out.
Number was: 4
如果我拿走了论证并且只是$SIG{ALRM} = \×up;
,那么程序就会按预期工作。但是,在这种情况下,我无法将参数传递给子例程,并且必须使用全局,我宁愿不这样做。
我做错了什么?谢谢你的帮助。
答案 0 :(得分:6)
\×up($number)
调用timesup
子(×up($number)
),然后引用返回值(\
)。应避免使用&
调用sub,因为这会绕过原型并可能产生某些其他影响。
解决方案是将timesup
应用程序包装成这样:
$SIG{ALRM} = sub { timesup($number) };
这实际上是partial application。
答案 1 :(得分:-2)
您应该将信号处理程序设置为:$SIG{ALRM} = 'timesup'