Reading single keystrokes, POSIX::Termios

#!/usr/bin/perl
use strict;

use POSIX qw( :termios_h); 
my ($term, $term_org, $echo, $noecho, $fd_stdin); 

$fd_stdin = fileno( STDIN); 
$term = POSIX::Termios->new(); 
$term->getattr( $fd_stdin); 
$term_org = $term->getlflag();
$echo = ECHO | ECHOK | ICANON;
$noecho = $term_org & ~$echo; 

sub cbreak
{
    $term->setlflag( $noecho); 
    $term->setcc( VTIME, 1);
    $term->setattr( $fd_stdin, TCSANOW); 
}
sub nocbreak
{
    $term->setlflag( $term_org); 
    $term->setcc( VTIME, 0);
    $term->setattr( $fd_stdin, TCSANOW); 
}
sub inkey
{
    my $key = -1;
    cbreak();
    sysread( STDIN, $key, 1); 
    nocbreak();
    return $key;
}

END 
{
    nocbreak(); 
}

while(1)
{
    print " you typed " . inkey() . "\n";
}