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:
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, ...