在Windows中等待Perl上的输入时出现警报超时

时间:2019-02-01 07:39:34

标签: windows perl timeout

在Windows中可以使用Perl中的警报功能吗?

警报似乎在Windows中不起作用。

如果在N秒内未输入任何用户输入,则以下代码应超时。该代码在linux上运行良好,但在Windows上却挂在那里。

代码:

$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 :(得分:1)

在Windows Perl上没有简单/方便的方法来使STDIN上的超时。以下代码实现了带有超时的简单的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";