Вы можете играть с Term :: ReadKey. Вот очень простой пример, с некоторым обнаружением для backspace и удаления ключа. Я тестировал его на Mac OS X 10.5, но в соответствии с ReadKey manual он должен работать под Windows. manual указывает, что под Windows с использованием неблокирующих чтений (ReadKey(-1)
) произойдет сбой. Вот почему я использую ReadKey (0), который в основном getc
(подробнее о getc в libc manual).
#!/usr/bin/perl
use strict;
use warnings;
use Term::ReadKey;
my $key = 0;
my $password = "";
print "\nPlease input your password: ";
# Start reading the keys
ReadMode(4); #Disable the control keys
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
#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) {
# Do nothing with these control characters
} else {
$password = $password.$key;
print "*(".ord($key).")";
}
}
ReadMode(0); #Reset the terminal once we are done
print "\n\nYour super secret password is: $password\n";
Это не работает под Windows. Он отлично работает, пока вы не нажмете клавишу ввода, когда вам нужно нажать четыре раза, чтобы он реагировал. Если вы используете ReadMode (2), то он работает нормально, но не эхо, пока вы не нажмете return. Не отображать * может быть приемлемой альтернативой –
Это не работает в Windows, потому что десятичное значение ascii ключа Enter или Return равно 13 (CR: возврат каретки). Как только вы замените строку while (ord ($ key = ReadKey (0))! = 10) с while (ord ($ key = ReadKey (0))! = 13), он работает лучше :) – Damien
Возможно, вам также захочется проверить «\ x03» (^ C); Кроме того, вы, вероятно, захотите испустить «\ b \ b» только в том случае, если длина ($ пароль)> 0 или на основе возвращаемого значения chop() (чтобы избежать стирания приглашения, если пользователь продолжает возвращать назад) – vladr