Perl IO::选择此选项可在运行continuos检查时查找用户输入。如何退出?
Im使用IO::Select在同时运行连续检查时查找用户输入。然而,一旦接收到输入,循环就不会退出。如何退出?下面是一些测试代码: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)){
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代表一个实际的换行符,你打算怎么做?虽然输入长度可变,但它必须是集合中的少数几件事之一。如果不是,则会捕获并显示一条消息。这个过程是在一个循环中,当程序等待正确的输入时,它每分钟运行一次子时间检查。但是,消除了一些不必要的东西并清理了我的代码,我让它工作起来,见下文。