2012-04-13 68 views
1

“#”我面临的一个问题,对此我不能与下面的子程序就明白了:除非密码包含“#”问题在Perl中

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本身存在一些问题。你能帮忙吗?

+0

当您使用'#'时会出现什么错误 – Anil 2012-04-13 09:14:54

+0

我没有收到任何错误,但脚本没有与需要自动执行的工具连接。 – 2012-04-13 09:15:46

+0

你有没有资源泄漏,因为你的'$ StdIn'不是'my'变量?你是否也需要关闭'$ Stdin'?这将是很好的解决不稳定的缩进。你只是因为使用''ch''让我去查看Perl文档来发现这是一种表示控制字符的方式,所以你使用'\ ch'作为一种长期的方式写'\ b',就像你使用'10'来识别'\ r'(所以你的循环测试可能是多余的)。 – 2012-04-13 09:39:24

回答

0

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

+0

是的,我做到了这一点,并显示##。但是一旦密码返回到调用子例程来连接工具,它不会与#工作。 – 2012-04-13 10:19:43

+4

@gautamkumar那么如果你的子函数返回正确的密码,那么错误可能在脚本的实际调用其他应用程序的(未显示的)部分。 – dgw 2012-04-13 11:01:34

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->newrather than indirect object syntax

  2. 请使用strictwarnings

  3. 您要打印的*字符将在输入密码后才会显示。如果你坚持用Perl编写C语言,请在while之前使用local $| = 1