Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl IO::选择此选项可在运行continuos检查时查找用户输入。如何退出?_Perl - Fatal编程技术网

Perl IO::选择此选项可在运行continuos检查时查找用户输入。如何退出?

Perl IO::选择此选项可在运行continuos检查时查找用户输入。如何退出?,perl,Perl,Im使用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)){

Im使用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?因为它只是一个工具。正如您所说,问题本身:


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

…似乎不需要它。这可以通过电动汽车实现,例如:

#!/usr/bin/env perl

use warnings;
use strict;
use EV;

my $periodic = EV::timer 0, 2, sub
{
  print "timecheck\n";
};

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::Select

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 $input\n";
          $stop = 1;
     }
}

sub timecheck
{
     print "do you like my hat?\n";
}

使用分块读取(例如)违背了使用select的目的,而更改为sysread意味着您可以读取多行。因此,存在循环的概念没有任何意义,除非您有一个大循环来重新执行此代码以从STDIN获取下一行。在我看来,您需要类似Term::ReadKeyi的东西。我希望在等待用户输入时,每分钟调用一次timecheck子例程。当用户输入长度可变的字符串时,我希望停止整个过程,并对输入进行处理。你能推断一下为什么我所做的没有意义吗?如果你最后读到七个字符的abc\ndef,其中\n代表一个实际的换行符,你打算怎么做?虽然输入长度可变,但它必须是集合中的少数几件事之一。如果不是,则会捕获并显示一条消息。这个过程是在一个循环中,当程序等待正确的输入时,它每分钟运行一次子时间检查。但是,消除了一些不必要的东西并清理了我的代码,我让它工作起来,见下文。