Basándose en el programa de Pierr-Luc, se agregó un cierto control sobre las barras invertidas. Con esto, no puede seguir presionando la barra invertida para siempre:
sub passwordDisplay() {
my $password = "";
# Start reading the keys
ReadMode(4); #Disable the control keys
my $count = 0;
while(ord($key = ReadKey(0)) != 10) {
# This will continue until the Enter key is pressed (decimal value of 10)
# For all value of ord($key) see http://www.asciitable.com/
if(ord($key) == 127 || ord($key) == 8) {
# DEL/Backspace was pressed
if ($count > 0) {
$count--;
#1. Remove the last char from the password
chop($password);
#2 move the cursor back by one, print a blank character, move the cursor back by one
print "\b \b";
}
}
elsif(ord($key) >= 32) {
$count++;
$password = $password.$key;
print "*";
}
}
ReadMode(0); #Reset the terminal once we are done
return $password;
}
Esto no funciona en Windows. Funciona bien hasta que llegue a presionar la tecla Intro, cuando tiene que presionarlo cuatro veces para que reaccione. Si usa ReadMode (2), funciona bien, pero no se repite hasta que toca return. No mostrar el * puede ser una alternativa aceptable –
No funciona en Windows porque el valor de ascii decimal de la tecla Intro o Retorno es 13 (CR: retorno de carro). Una vez que reemplaza la línea while (ord ($ key = ReadKey (0))! = 10) con while (ord ($ key = ReadKey (0))! = 13), funciona mejor :) – Damien
Probablemente también quiera para verificar "\ x03" (^ C); también, probablemente quiera emitir "\ b \ b" solo si la longitud ($ contraseña)> 0 o en función del valor de retorno de chop() (para evitar borrar el aviso si el usuario sigue retrocediendo) – vladr