如何测试STDIN是否有东西可读(Windows上的Perl)

时间:2013-03-07 01:37:05

标签: windows perl asynchronous filehandler

我在Perl中遇到过问题。为了测试STDIN文件处理程序是否有东西可以立即读取,我想像这样编程。

while(1)
{
     my ($l);
     if (TestCanRead(STDIN))
     {
         $l = <STDIN>;
         HandleRead($l);
     }
     else
     {
         HandleNotRead();
     }
}

 while(1)
 {
     my ($l);
     $l = ReadImmediate(STDIN);
     if (defined($l))
     {
         HandleRead($l);
     }
     else
     {
          HandleNotRead();
     }

 }

有人可以告诉我如何编写函数 ReadImmediate TestCanRead 在Windows系统上?谢谢。

1 个答案:

答案 0 :(得分:2)

不幸的是,我没有Windows环境可供测试,但Perl声称可移植性。所以我们假设Unix解决方案有效。

你想要select或它周围的包装。我通常使用IO::Select,如下所示:

use IO::File;
use IO::Select;

my $select = IO::Select->new( \*STDIN );

while (1) {
    if (my @ready_FHs = $select->can_read(0)) {
        foreach my $FH (@ready_FHs) {
            say $FH->getline();
        }
    } else {
        say "Nothing to do; napping";
        sleep 1;
    }
}