De respuesta perlfaq8 's a How do I read just one key without waiting for a return key? :
El control de amortiguación de entrada es una cuestión muy dependiente del sistema. En muchos sistemas, puede usar el comando stty como se muestra en getc in perlfunc, pero como puede ver, eso ya lo está metiendo en problemas de portabilidad.
open(TTY, "+</dev/tty") or die "no tty: $!";
system "stty cbreak </dev/tty >/dev/tty 2>&1";
$key = getc(TTY); # perhaps this works
# OR ELSE
sysread(TTY, $key, 1); # probably this does
system "stty -cbreak </dev/tty >/dev/tty 2>&1";
El Term :: módulo de CPAN ReadKey ofrece una interfaz fácil de usar que debería ser más eficientes que los bombardeos a cabo a stty para cada tecla. Incluso incluye soporte limitado para Windows.
use Term::ReadKey;
ReadMode('cbreak');
$key = ReadKey(0);
ReadMode('normal');
Sin embargo, utilizando el código requiere que tenga un compilador C de trabajo y se puede utilizar para construir e instalar un módulo CPAN. Aquí hay una solución que usa el módulo POSIX estándar, que ya está en su sistema (suponiendo que su sistema sea compatible con POSIX).
use HotKey;
$key = readkey();
Y aquí está el módulo HotKey, que esconde las llamadas un tanto desconcertantes para manipular las estructuras de termios POSIX.
# HotKey.pm
package HotKey;
@ISA = qw(Exporter);
@EXPORT = qw(cbreak cooked readkey);
use strict;
use POSIX qw(:termios_h);
my ($term, $oterm, $echo, $noecho, $fd_stdin);
$fd_stdin = fileno(STDIN);
$term = POSIX::Termios->new();
$term->getattr($fd_stdin);
$oterm = $term->getlflag();
$echo = ECHO | ECHOK | ICANON;
$noecho = $oterm & ~$echo;
sub cbreak {
$term->setlflag($noecho); # ok, so i don't want echo either
$term->setcc(VTIME, 1);
$term->setattr($fd_stdin, TCSANOW);
}
sub cooked {
$term->setlflag($oterm);
$term->setcc(VTIME, 0);
$term->setattr($fd_stdin, TCSANOW);
}
sub readkey {
my $key = '';
cbreak();
sysread(STDIN, $key, 1);
cooked();
return $key;
}
END { cooked() }
1;
Pude usar el primer método (más algunos del segundo): abrir el TTY, configurarlo para romper caracteres, y luego usar sysread para capturar solo 1 caracter – Lathan