Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:信号处理器:Can';t使用未定义的值作为符号引用_Perl_Signals - Fatal编程技术网

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
}