jeg fandt denne løsning hvis du har installeret Active Perl:
use Term::ReadKey;
# optional: END { ReadMode ('restore'); } # just in case
$| = 1; # unbuffer stdout
my $pwd = '';
# two ways - first doesn't echo anything, second echoes * for each char and
# allows correction
if (0) {
print "Password: ";
ReadMode ('noecho');
$pwd = ReadLine ();
chomp $pwd;
ReadMode ('restore');
} else {
binmode STDIN;
print "Password: ";
ReadMode ('cbreak');
while (defined (my $ch = ReadKey ())) {
last if $ch eq "\x0a" or $ch eq "\x0d";
if ($ch eq "\x08") { # backspace
print "\b \b" if $pwd; # back up 1
chop $pwd;
next;
}
if ($ch eq "\x15") { # ^U
print "\b \b" x length $pwd; # back 1 for each char
$pwd = '';
next;
}
$pwd .= $ch;
print '*';
}
ReadMode ('restore');
}
print "\n";
print "Password entered was $pwd\n";
__END__
use Win32::Console;
$| = 1; # unbuffer stdout
my $debug = 1;
my $key = '';
my $passwd = '';
my $prompt = "Type password followed by ENTER: ";
my $prompt2 = "try again: ";
my $IN = new Win32::Console (STD_INPUT_HANDLE) or die $!;
print $prompt;
$IN->Flush (); # optionally flush input
while (1) {
my @e = $IN->Input();
print "Event='@e'\n" if $debug;
next if ($e[0] != 1 or $e[1] != 0); # not keybd key up
my $key = chr ($e[5]);
print "key=$key '$e[5]'\n" if $debug;
if ($key =~ /[\r\n]/) { # EOL
if (length $passwd > 0) {
print "\n";
last;
}
} elsif ($e[5] == 8 and ($e[6] == 8 or $e[6] == 0)) { # BS or DEL
$passwd =~ s/^(.*).$/$1/;
print "\b \b";
print "1 passwd=$passwd ", length $passwd, "\n" if $debug;
} elsif ($e[6] == 8 and $e[5] == 21) { # ^U
$passwd = '';
print "2 passwd=$passwd ", length $passwd, "\n" if $debug;
} elsif ($e[6] == 8 and ($e[5] == 4 or $e[5] == 26)) { # ^D or ^Z
last;
} elsif ($e[6] == 0 or $e[6] == 16) { # regular key
next if $e[5] == 0;
$passwd .= $key;
print "3 passwd=$passwd ", length $passwd, " " if $debug;
print "*";
print "\n" if $debug;
} else {
print "? passwd=$passwd ", length $passwd, "\n" if $debug;
print "Illegal key\n";
}
}
print "passwd=$passwd\n" if $debug;
$IN->Flush ();
#$IN->Free (); # don't free or you lose STDOUT
#undef $IN;
__END__
fundet her:
http://www.mail-archive.com/activeperl@listserv.activestate.com/msg13789.html