当我在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
?
你不能,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。