Тайм-аут с тревогой при ожидании ввода на Perl в Windows - PullRequest
0 голосов
/ 01 февраля 2019

Есть ли альтернатива для функции будильника в Perl, которая будет использоваться в Windows?

Сигнализация не работает в Windows.

Приведенный ниже код должен прерваться, если пользовательский ввод не будет выполнен в течение N секунд.Код хорошо работает в Linux, но там висит на Windows.

CODE:

$SIG{ALRM} = \&input_timed_out;

eval {

        alarm(10);

        $input = <>;
        alarm(0);   
        print $input."\n";
}

print "eval exit with:  $@  \n";

if ( $@ =~ /NO USER INPUT IN TIME/ ) {

       print "Timed out.\n";
       $input = "quit";
}

print "Answer is $input\n";

sub input_timed_out {

           die "NO USER INPUT IN TIME";

}

1 Ответ

0 голосов
/ 01 февраля 2019

Нет простого / удобного способа получить время ожидания на STDIN в Windows Perl.Следующее реализует простую функцию readline с тайм-аутом.Он не обрабатывает клавиши возврата или курсора, поэтому вам все равно придется их реализовать.Он демонстрирует, как реализовать тайм-аут в Windows для STDIN.

#!perl
use strict;
use warnings;
use Term::ReadKey;

sub timed_input {
   my $end_time = time + shift;
   my $string ;
   do {
       my $key = ReadKey(1);
       $string .= $key if defined $key;
       print "\r$string" if (defined $string);
   } while (time < $end_time);
   return $string
};

my $input = '';
if( -t ) { 
    # we are interactive 
    $input = timed_input(3);
} else {
    $input = <>;
};
print "Input is [$input]\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...