私は 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、入力を受け入れるには 2 回押す必要があります。print $password
ただし、2 番目の while ループを削除する (またはステートメントに置き換える) と、入力は を 1 回押すだけで済みEnterます。
yまた、2 番目の while ループで、ユーザーにorを入力するように求めるプロンプトが表示されることにも気付きましたn(押す必要はありませんEnter)。ユーザーが 'y' をShow password? [y/n]
入力すると、パスワードを表示する前に行が繰り返されます。
この動作に関するいくつかの洞察をいただければ幸いです。