Как проверить, есть ли в 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;
}
}