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  local $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
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19