Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

¿ Cómo hacer un Term::ReadKey ?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Sab Dic 29, 2007 6:59 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
¿ Cómo hacer un Term::ReadKey ? Responder citando

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?
Mensaje Sab Dic 29, 2007 9:20 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4142
Ubicación: Valladolid, España
Responder citando

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
Mensaje Dom Dic 30, 2007 9:45 am
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 487
Ubicación: Frente al monitor
Responder citando

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

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.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group