在模块中使用$ SIG {WINCH}时出现问题

时间:2012-02-14 14:02:03

标签: perl module window terminal signals

当我在脚本中使用此模块时,当我更改终端尺寸时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;
        }
        # ...
        # ...
    }
}

2 个答案:

答案 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;