Я новичок в Perl, и мне трудно понять поведение следующего фрагмента кода ввода пароля:
use Win32::Console;
my $StdIn = new Win32::Console(STD_INPUT_HANDLE);
my $Password = "";
$StdIn->Mode(ENABLE_PROCESSED_INPUT());
local $| = 1;
print "Enter Password: ";
while (my $Data = $StdIn->InputChar(1)) {
if ("\r" eq $Data ) {
last;
}
elsif ("\ch" eq $Data ) {
if ( "" ne chop( $Password )) {
print "\ch \ch";
}
next;
}
$Password .=$Data;
print "*";
}
while (my $Data = $StdIn->InputChar(1)) {
print "\nShow password? [y/n] ";
if ("n" eq $Data) {
last;
}
elsif ("y" eq $Data) {
print "\nPassword: $Password\n";
last;
}
}
По сути, сценарий запрашивает у пользователя пароль и отображает *
для каждого введенного символа, как и ожидалось, но требует двойного нажатия Enter, чтобы принять ввод. Однако, если я удалю второй цикл while (или заменю оператором print $password
), для ввода потребуется только одно нажатие Enter.
Я также заметил, что во втором цикле while пользователю предлагается ввести y или n (без необходимости нажимать Enter), если пользователь вводит «y», затем строка Show password? [y/n]
повторяется перед отображением пароля.
Некоторое понимание этого поведения будет оценено.