【问题标题】:unable to take 0 as password input using Win32::Console无法使用 Win32::Console 将 0 作为密码输入
【发布时间】:2015-09-02 17:10:31
【问题描述】:

我是这个领域的新手。我正在使用下面的代码来屏蔽密码。它工作正常,但在输入密码为 0(例如 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;
}

【问题讨论】:

    标签: perl mask perl-module mod-perl


    【解决方案1】:

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

    $Data = $handle->InputChar(1)
    

    $handle->InputChar(1) 返回"0" 字符串时为假。也许更好的检查是输入是否与空字符串不匹配:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      相关资源
      最近更新 更多