2012-04-13 67 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