Найдено результатов: 1

Как я могу проверить STDIN без блокировки в Perl?

Я пишу свое первое приложение Perl - AOL Instant Messenger bot, который разговаривает с Arduino microcontroller, который, в свою очередь, управляет сервомотором, который нажимает кнопку питания на сервере нашего sysadmin, который случайным образом зависает каждые 28 часов или около того.

Я сделал все самое сложное, я просто пытаюсь добавить последний бит кода, чтобы разорвать основной цикл и выйти из AIM, когда пользователь наберет 'quit'.

Проблема в том, что если я попытаюсь прочитать из STDIN в главном цикле программы, он блокирует процесс до тех пор, пока не будет введен ввод, по сути, делая бота неактивным. Я пробовал тестировать для EOF перед чтением,но никаких костей... EOF просто всегда возвращает false.

Вот ниже приведен пример кода, с которым я работаю:

while(1) {
    $oscar->do_one_loop();

# Poll to see if any arduino data is coming in over serial port
    my $char = $port->lookfor();

# If we get data from arduino, then print it
    if ($char) {
        print "" . $char ;
    }

    # reading STDIN blocks until input is received... AAARG!
    my $a = <STDIN>;
    print $a;
    if($a eq "exit" || $a eq "quit" || $a eq 'c' || $a eq 'q') {last;}
}

print "Signing off... ";

$oscar->signoff();
print "Done\n";
print "Closing serial port... ";
$port->close() || warn "close failed";
print "Done\n";

perl   stdin    

404   2   02:38, 13th August, 2020