Perl:信号处理器:Can';t使用未定义的值作为符号引用
我有以下资料:Perl:信号处理器:Can';t使用未定义的值作为符号引用,perl,signals,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'; # l
#! /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
医生说没问题
$ perldoc sigtrap
...
use sigtrap 'handler' => \&my_handler, 'normal-signals';
我不知道怎么回事。我建议,
$fh
是未定义的符号引用。use
在编译阶段运行(就像在BEGIN{…}
块中一样),并且,根据您认为调用它的位置,$fh
可能从未打开过,或者它的作用域可能不是您所认为的
在处理程序中添加一些调试,例如显示$fh的值和$fh的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
}
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
}