Cronometrando el Tiempo de Entrada con alarm

La función alarm establece un cronómetro. Cuando la cuenta atrás termina el sistema operativo emite una señal ALRM, la cual puede ser interceptada por un manejador de señales. Con un argumento 0 desactiva el cronómetro. Este primer ejemplo pide al usuario un password, controlando si el tiempo de lectura ha excedido un cierto límite:

lhp@nereida:~/Lperl/src$ cat -n time_exceeded.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  use Term::ReadKey;
 4
 5  my $deadline = (shift || 3);
 6  my $time_exceeded = 0;
 7  sub set_time_exceeded { $time_exceeded = 1; }
 8  ReadMode('noecho');
 9  $SIG{ALRM} = "set_time_exceeded";
10  print "Teclee su password: ";
11  alarm($deadline);
12  my $passwd = ReadLine(0); # 0 = lectura normal desde STDIN
13  alarm(0);
14  ReadMode 0; # Restaurar valores originales
15  print "\n";
16  print STDERR "Tiempo excedido.\n" if $time_exceeded;
En este ejemplo hemos utilizado el módulo Term::ReadKey para evitar el eco del tecleo de la clave en la pantalla.

Para leer un password es recomendable que use el módulo Term::ReadPassword disponible en CPAN:

lhp@nereida:~/Lperl/src$ perl -wd -e 0
main::(-e:1):   0
  DB<1> use Term::ReadPassword
  DB<2> $password = read_password('password: ', 3)
password:
  DB<3> x $password
0  undef
  DB<4> $password = read_password('password: ', 10)
password:
  DB<5> x $password
0  'skasjfd'
  DB<6> $password = read_password('password: ')
password:
  DB<7> x $password
0  'sdhdfh'

Casiano Rodríguez León
2010-03-22