The easiest way to do this is to read a key in nonblocking mode with the Term::ReadKey module from CPAN, passing it an argument of -1 to indicate not to block:
use Term::ReadKey;
ReadMode('cbreak'); if (defined ($char = ReadKey(-1)) ) {
# input was waiting and it was $char
} else {
# no input was waiting
} ReadMode('normal'); # restore normal tty settings