Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

Term::ReadPassword::Win32 kills STDIN

by Gulliver (Monk)
on Feb 04, 2011 at 21:46 UTC ( #886306=perlquestion: print w/replies, xml ) Need Help??
Gulliver has asked for the wisdom of the Perl Monks concerning the following question:

After the call to read_password STDIN stops working. It doesn't wait for user input. Any ideas?

#!/usr/bin/perl use strict; use warnings; use Term::ReadPassword::Win32; $Term::ReadPassword::Win32::USE_STARS = 1; my $pass1 = read_password(' sftp password: '); print "Password:$pass1,\n"; print "\nLoad template configuration? \n[Y/n] :"; chomp (my $ans=<STDIN>); #doesn't wait here for input print "ans=$ans,,,\n";

Replies are listed 'Best First'.
Re: Term::ReadPassword::Win32 kills STDIN
by syphilis (Chancellor) on Feb 04, 2011 at 23:22 UTC
Re: Term::ReadPassword::Win32 kills STDIN
by furry_marmot (Pilgrim) on Feb 04, 2011 at 23:59 UTC
    You could also just use Term::ReadKey. I've used it on Win2k, XP, and Vista. It's clumsy to use, but I stuffed it into a utility module I use, like so:
    my $pword = get_pword( "Enter password" ); print "Password is '$pword'\n"; sub get_pword { use Term::ReadKey; my ($prompt) = shift; my $pword; my $key; local $| = 1; # Turn off STDOUT buffering for immediate response print "$prompt: "; ReadMode 4; # Change to Raw Mode, disable Ctrl-C while( 1 ) { while (not defined ($key = ReadKey(-1))) { } if(ord($key) == 13) { # if Enter was pressed... print "\n"; # print a newline last; # and get out of here } print '*'; $pword .= $key; } ReadMode 0; # Reset tty mode before exiting. <==IMPORTANT return $pword; }

    Also, Term::ReadKey comes standard with Perl.


    UPDATE: Fixed a sorta bug. Accidentally introduced an extraneous while loop when I copied the code. Didn't hurt anything but my pride...

      Thanks! Have you considered putting this on cpan?
        This and several other solutions are addressed in perlfaq8. It turns out to be surprisingly platform-dependent.

      On Linux, you also need to check for \n, not only \r

      if(ord($key) == 13 || ord($key) == 10) { # if Enter was pressed...

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://886306]
Approved by ikegami
Front-paged by ikegami
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (8)
As of 2018-06-22 00:48 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (120 votes). Check out past polls.