Проблемы с $ SIG {WINCH} при использовании его в модуле - PullRequest
1 голос
/ 14 февраля 2012

Когда я использую этот модуль в скрипте, 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 ]

1 голос
/ 14 февраля 2012

Я думаю, что нашел причину: помимо этого модуля я загружаю второй модуль, который тоже использует $SIG{WINCH}.
Когда я не загружаю второй модуль, подпрограмма choose работает как положено.

0 голосов
/ 14 февраля 2012

Почему вы изменяете переменную и ждете ее в бесконечном цикле?

Не было бы лучше, если бы вы вызывали эту подпрограмму напрямую из обработчика сигнала?

$ SIG {WINCH}= sub {print STDERR "WINCH! \ n"; выбрать ();};

Этот обработчик находится в главном разделе вашего модуля, он выполняется во время выполнения, а не во время выполнения, и только если вы используете use not require.

Возможно, это работает в модуле

local $size_changed;
BEGIN{
   $SIG{WINCH} = sub { $size_changed = 1; };
}

Просто предположение: попробуйте использовать Perl :: Unsafe :: Signals.

use Perl::Unsafe::Signals;
...