1

我遇到了一个我无法通过下面的子程序理解的问题:

sub password()
{
$StdIn = new Win32::Console(STD_INPUT_HANDLE);
my $Password = "";

$StdIn->Mode(ENABLE_PROCESSED_INPUT);
print "Enter Password: ";

    while (ord(my $Data = $StdIn->InputChar(1)) !=10) 
    { 

               if("\r" eq $Data )
            {
            last;
        }
         elsif ("\ch" eq $Data)
         {
            if( "" ne chop( $Password ))
             {
                print "\ch \ch";
             }
            next;
        }
    $Password .=$Data;
    print "*";
    }

 return $Password;

}

除非密码包含“#”,否则上述脚本可以正常工作。如果它包含“#”,则调用上述子程序的主子程序没有与工具连接,我需要自动化。尽管该工具没有问题#——当我手动使用它时,“它可以很好地使用#”。所以我认为 Perl 本身存在一些问题。你能帮忙吗?

4

2 回答 2

3

首先,使用Term::Prompt而不是自己弄乱控制台。

#!/usr/bin/env perl

use strict; use warnings;
use Term::Prompt;

my $pass = prompt P => 'Password: ', undef, undef;
print "$pass\n";

至于您的问题,我假设问题出在您未显示的部分。但是,请注意

  1. 使用Win32::Console->new 而不是间接的对象语法

  2. 一定要使用strictwarnings

  3. 在输入密码之前,您正在打印的*字符不会出现。如果您坚持用 Perl 编写 C,请local $| = 1在您之前使用。while

于 2012-04-13T11:30:09.620 回答
0

您是否尝试显示输入?只需编写 print $Data; 看看它是否接受输入。

于 2012-04-13T09:40:19.967 回答