Как проверить, есть ли в STDIN что-то для чтения (Perl в Windows)

Я столкнулся с проблемой в 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 ответ

К сожалению, у меня нет среды 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;
    }
}
Другие вопросы по тегам