当我在Linux系统上运行以下代码时,按预期,它大约每两秒钟输出Nothing is ready
,并且还将输入到控制台的任何内容输出。
但是在Windows上,can_read
会立即返回零项。
use IO::Select;
my $sel = IO::Select->new();
$sel->add(\*STDIN);
while ( 1 ) {
my @ready = $sel->can_read(2);
if ( scalar @ready == 0 ) {
print "Nothing is ready\n";
}
foreach my $fh ( @ready ) {
if ( $fh eq \*STDIN ) {
my $in = <STDIN>;
print "got $in from stdin\n";
}
}
}
似乎select
仅适用于Windows套接字,不适用于STDIN。在Windows系统上的STDIN上如何使用IO::Select
?
答案 0 :(得分:2)
perldoc perlport
不能这样声明:
select Only implemented on sockets. (Win32, VMS)
这是由Windows本身仅对套接字实现select()
引起的,请参见https://docs.microsoft.com/de-de/windows/desktop/api/winsock2/nf-winsock2-select。
Windows等效项为I/O Completion Ports。但是您必须找到一种在Perl中使用它们的方法。
如果您真的只关心STDIN,则可以使用Term::ReadKey
以ReadMode
为-1(无阻塞)循环轮询。就像该模块的名称所暗示的那样,这可能仅适用于tty。