当我在脚本中使用此模块时,当我更改终端尺寸时if ( $size_changed ) {
仍为假。
当我直接在脚本中复制模块中的代码时(这样我就不必加载模块)它按预期工作。
将代码作为模块加载不起作用是什么?
use warnings;
use 5.014;
package My_Package;
use Exporter 'import';
our @EXPORT = qw(choose);
my $size_changed;
$SIG{WINCH} = sub { $size_changed = 1; };
sub choose {
# ...
# ...
while ( 1 ) {
my $c = getch();
if ( $size_changed ) {
write_screen();
$size_changed = 0;
next;
}
# ...
# ...
}
}
答案 0 :(得分:1)
我想我找到了原因:除了这个模块,我还加载了第二个使用$SIG{WINCH}
的模块。
当我不加载第二个模块时,choose
子例程按预期工作。
答案 1 :(得分:-1)
为什么要修改变量然后在无限循环中等待它呢?
如果你直接从信号处理程序调用那个sub会不会更好?
$ SIG {WINCH} = sub {print STDERR“WINCH!\ n”; choose(); };
这个处理程序在你的模块主要部分中,它在complie时间执行而不是执行时间,并且只有在你使用use不需要时才执行。
也许这适用于模块
local $size_changed;
BEGIN{
$SIG{WINCH} = sub { $size_changed = 1; };
}
只是猜测:尝试使用Perl :: Unsafe :: Signals。
use Perl::Unsafe::Signals;