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 に答える