dda
asked on
Erasing characters using BackSpace
I'd like to perform a char-by-char login and password input. How can I display input properly when BackSpace key pressed? The current source is like the following, but it does not erase chars (I don't know how to do this). It should work in Unix, Win32 used for some testing only.
#!/usr/local/bin/perl
#
use Term::ReadKey;
use English;
my $s;
if ($OSNAME =~ /WIN32/i) {
$ENTER = chr(13);
} else {
$ENTER = chr(10);
}
print "Password: ";
readstring($s, "*");
exit;
#************************* ********** ***
sub getchar {
ReadMode 4;
my $k;
while(!defined ($k)) {
$k = ReadKey(-1);
next if (!defined ($k));
}
ReadMode 0;
return $k;
}
#************************* ********** ***
sub readstring {
my ($str, $passwordchar) = @_;
my ($s) = "";
my ($i_char) = "Empty";
while ($i_char ne $ENTER) {
$i_char = getchar();
if (ord($i_char) == 8) { # BackSpace
$s = substr($s, 0, length($s)-1);
} elsif ($i_char ne $ENTER) {
print (defined $passwordchar ? $passwordchar : $i_char);
$s .= $i_char;
} elsif ($i_char eq $ENTER) {
} else {
print "Unknown character in line!\n";
}
}
$_[0] = $s . "\n";
return 0; # normal completion
}
#!/usr/local/bin/perl
#
use Term::ReadKey;
use English;
my $s;
if ($OSNAME =~ /WIN32/i) {
$ENTER = chr(13);
} else {
$ENTER = chr(10);
}
print "Password: ";
readstring($s, "*");
exit;
#*************************
sub getchar {
ReadMode 4;
my $k;
while(!defined ($k)) {
$k = ReadKey(-1);
next if (!defined ($k));
}
ReadMode 0;
return $k;
}
#*************************
sub readstring {
my ($str, $passwordchar) = @_;
my ($s) = "";
my ($i_char) = "Empty";
while ($i_char ne $ENTER) {
$i_char = getchar();
if (ord($i_char) == 8) { # BackSpace
$s = substr($s, 0, length($s)-1);
} elsif ($i_char ne $ENTER) {
print (defined $passwordchar ? $passwordchar : $i_char);
$s .= $i_char;
} elsif ($i_char eq $ENTER) {
} else {
print "Unknown character in line!\n";
}
}
$_[0] = $s . "\n";
return 0; # normal completion
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER