IO::选择在运行连续检查时查找用户输入.如何退出



我使用IO::Select查找用户输入,同时运行连续检查。这是可行的,但是,一旦接收到输入,循环将不会退出。如何退出?下面是一些测试代码:

my $timeout = 2;
my $tmp_input = IO::Select->new();
$tmp_input->add(*STDIN);
my $input;
my $stop = 0;
while ($stop == 0){
    if (my @ready = $tmp_input->can_read($timeout)){
        $stop = 1;
        for my $fh (@ready){
            $input = <$fh>;
        }
    }else{
        timecheck();
    }
}

IO::Select是required吗?因为它只是一个工具。问题本身正如你所说的:

我想在等待用户输入时每分钟调用一次timecheck()子例程。当用户输入可变长度的字符串时,我希望停止整个过程,并对输入

进行处理。

…似乎不需要它。它可以用EV完成,例如:

#!/usr/bin/env perl
use warnings;
use strict;
use EV;
my $periodic = EV::timer 0, 2, sub
{
  print "timecheckn";
};
my $user_input = EV::io *STDIN, EV::READ, sub
{
  my ($w, $revents) = @_;
  chomp(my $input = <STDIN>);
  printf "processing your data (%s)...n", $input;
  EV::break if $input eq 'quit';
};
EV::run;

目前还不清楚输入是"停止"程序的处理还是完全停止,但这可能很容易改变。

清理完代码后,执行问题指定的操作:
使用警告;
使用严格的;
使用IO::选择;

my $tmp_in = IO::Select->new();
$tmp_in->add(*STDIN);
my $stop = 0;
while ($stop == 0) {
     &timecheck();
     if ($tmp_in->can_read(5)) {
          chomp(my $input = <STDIN>);
          print "Got $inputn";
          $stop = 1;
     }
}
sub timecheck
{
     print "do you like my hat?n";
}

最新更新