代码之家  ›  专栏  ›  技术社区  ›  Secto Kia

在Windows上使用IO::Select on STDIN

  •  3
  • Secto Kia  · 技术社区  · 6 年前

    Nothing is ready 大约每两秒钟一次,并将输入的任何内容输出到控制台。

    但在窗户上, 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 IO::Select 在Windows系统的STDIN上?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Guido Flohr    6 年前

    你不能, 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