Sab Dic 29, 2007 6:59 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
|
|
| ¿ Cómo hacer un Term::ReadKey ? |
|
|
En Perl Cookbook sale un ejemplo de cómo usar Term::ReadKey para saber qué tecla fue usada (leer el STDIN sin tener que esperar el "\n").
Yo sé que usando POSIX y sysread se puede hacer:
| Perl: | use POSIX;
use 5. 10. 0;
my $termios = new POSIX:: Termios;
$termios-> setcc( VTIME, 1 );
my $key;
sysread ( STDIN, $key, 1 );
say $key;
$termios-> setcc( VTIME, 0 ); |
Si a este código se le pone las funciones de noecho y echo, está hecho, pero...
¿Qué pasa si quiero leer las flechas ( up, down, right, left ) y otras teclas ( backspace, tab, F1, F2... ) ?
¿Se puede hace con POSIX o tiene que hacerse con Term::ReadKey? |
|
|
|

Sab Dic 29, 2007 9:20 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4142
Ubicación: Valladolid, España
|
|
|
|
|
Encontré esta página donde hay una solución: usar IO::Select para leer el estado del STDIN.
http://www.thescripts.com/forum/thread49817.html
Lo que no me creo es que no exista un módulo para eso. ¿Has mirado perlfaq8? Hay un par de respuestas interesantes.
Ultima edición por explorer el Dom Dic 30, 2007 9:55 am, editado 1 vez |
|
Dom Dic 30, 2007 9:45 am
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
|
|
|
|
|
| Muchas gracias por la respuesta, ahora veo el link y el FAQ |
|
Lun Dic 31, 2007 3:49 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
|
|
|
|
|
Al final, esta es la solución:
| Perl: | use POSIX;
use 5. 10. 0;
use strict;
my $t = new POSIX:: Termios;
$t-> setcc( VTIME, 1 );
my $att = $t-> getattr( fileno(STDIN) );
my $flag = $t-> getlflag();
$t-> setlflag( $flag & ~&POSIX:: ECHO );
$t-> setattr( fileno(STDIN), TCSANOW );
my $k;
binmode STDIN;
sysread ( STDIN, $k, 5 );
say ( join " ", ( unpack "c*", $k ) );
if ( $k eq "\e[A" ) { say "up"; }
$t-> setlflag(&POSIX:: ECHO);
$t-> setattr( fileno(STDIN), TCSANOW );
$t-> setcc( VTIME, 0 );
|
Leo 5 bytes y no 1 ya que teclas como F13 ( en darwin ) usa 5 bytes, las teclas up, down, left y right usan 3 bytes, así que 5 bytes el el máximo usado. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|