我有以下内容:
#! /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';
我无法弄清楚出了什么问题。
答案 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
}