Comment puis-je tester STDIN sans bloquer en Perl?

Je suis en train d'écrire mon premier Perl app -- AOL Instant Messenger bot qui parle à un microcontrôleur Arduino, qui contrôle à son tour un servo qui va pousser le bouton d'alimentation sur notre sysadmin du serveur, qui se bloque de façon aléatoire toutes les 28 heures ou plus.

J'ai obtenu tous les gros trucs à faire, je suis juste essayer d'ajouter un dernier bit de l'échec du code de la boucle principale et de déconnexion de l'OBJECTIF lorsque l'utilisateur tape 'quit'.

Le problème est que si j'essaie de le lire depuis l'entrée standard STDIN dans la boucle principale du programme, il bloque le processus jusqu'à ce que l'entrée est entrée, essentiellement rendu le bot inactif. J'ai essayé de tester pour EOF avant de le lire, mais pas de dés... EOF juste renvoie toujours false.

Voici ci-dessous un exemple de code, je travaille avec:

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";

source d'informationauteur | 2008-08-18