Perl:信号处理程序:不能使用未定义的值作为符号引用

时间:2017-01-19 22:22:50

标签: perl signals

我有以下内容:

#! /usr/bin/perl
use Fcntl ':flock';
use strict;
...
    my (@list, $fh);
    open $fh, "<:encoding(utf8)", $file or die "$file: $!";
    flock $fh, LOCK_EX;
    use sigtrap 'handler' => sub {flock($fh, LOCK_UN);}, 'normal-signals'; # line 72

当我按^C

时,它会运行但会出错
$ verify.pl
...
Can't use an undefined value as a symbol reference at ./verify.pl line 72.

文档说没关系

$ perldoc sigtrap
...
        use sigtrap 'handler' => \&my_handler, 'normal-signals';

我无法弄清楚出了什么问题。

1 个答案:

答案 0 :(得分:1)

我将建议$fh是未定义的符号引用。 use在编译阶段运行(就像在BEGIN {...}块中一样),并且,根据您认为调用它的位置,$fh可能永远不会被打开,或者它的范围可能与你的想法不同。

向处理程序添加一些调试,以显示$ fh的值和$ fh的refaddr。同时添加到您的open / flock代码中。我打赌refaddr不一样。

由于sigtrap是全局注册的,因此最好使用全局,例如:

my @handlers;
use sigtrap handler => sub { $_->() for grep defined, @handlers }, 'normal-signals';

{
  my ($fh, @list);
  open my $fh, ...
  flock $fh, LOCK_EX;
  my $handler = sub { flock $fh, LOCK_UN };

  @handlers = map { weaken $_ } grep defined, @handlers, $handler;
  # ... do stuff. When $handler goes out of scope, it'll go undef in @handlers
}