perl stdin

¿Cómo puedo probar STDIN sin bloquear en Perl?



(1)

El built-in de Perl es select() , que es un paso a través de la llamada al sistema select() , pero para personas sensatas recomiendo IO::Select .

Muestra de código:

#!/usr/bin/perl use IO::Select; $s = IO::Select->new(); $s->add(/*STDIN); while (++$i) { print "Hiya $i!/n"; sleep(5); if ($s->can_read(.5)) { chomp($foo = <STDIN>); print "Got ''$foo'' from STDIN/n"; } }

Estoy escribiendo mi primera aplicación Perl: un bot de AOL Instant Messenger que habla con un microcontrolador Arduino, que a su vez controla un servo que presionará el botón de encendido en el servidor de mi administrador de sistemas, que se congela aleatoriamente cada 28 horas más o menos.

He terminado todas las cosas difíciles, solo intento agregar un último bit de código para romper el ciclo principal y cerrar la sesión de AIM cuando el usuario escribe ''salir''.

El problema es que, si trato de leer desde STDIN en el ciclo principal del programa, bloquea el proceso hasta que se ingresa la entrada, esencialmente haciendo que el bot quede inactivo. He intentado probar EOF antes de leer, pero no hay ningún dado ... EOF simplemente siempre devuelve falso.

A continuación se muestra un código de muestra con el que estoy trabajando:

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