使用Win32 :: Console

时间:2015-09-02 17:10:31

标签: perl mask perl-module mod-perl

我是这个领域的新手。我使用以下代码来掩盖密码。它工作正常但在输入密码时出现问题,密码中有0(e.x. Pass012)。

一旦我输入0,这个脚本就会退出。它根本不是0输入。我试图找出原因,似乎my $Data = $handle->InputChar(1))无法读取0,我不确定原因。

任何人都可以深入研究这段代码,让我知道这里可能存在什么问题以及如何将0作为密码输入?

#!/usr/bin/perl
use Win32::Console;


use strict; use warnings;
use Win32::Console;

run();

sub run {
    my $StdIn = Win32::Console->new(STD_INPUT_HANDLE);
    $StdIn->Mode(ENABLE_PROCESSED_INPUT);

    my $Password = prompt_password($StdIn, "Enter Password: ", '*');

    print "\n$Password";

    return;
}

sub prompt_password {
    my ($handle, $prompt, $mask) = @_;
    my ($Password);

    local $| = 1;
    print $prompt;

    $handle->Flush;

    while (my $Data = $handle->InputChar(1)) {
        last if "\r" eq $Data;

        if ("\ch" eq $Data ) {
            if ( "" ne chop( $Password )) {
                print "\ch \ch";
            }
            next;
        }

        $Password .= $Data;
        print $mask;
    }

    return $Password;
}

1 个答案:

答案 0 :(得分:4)

字符串"0"在Perl中是假值,因此这个条件

$Data = $handle->InputChar(1)
$handle->InputChar(1)返回"0"字符串时,

为false。也许更好的检查输入是否与空字符串不匹配:

while ((my $Data = $handle->InputChar(1)) ne "") { ...