2014-09-21 96 views
0

一個項目我做上課要我在60有一個計數器開始和倒計時(印刷,因爲它去每個數字),但計數器需要停止在10秒間隔並詢問用戶輸入。我有一部分程序以「密碼」的形式工作。我遇到的問題是讓我的子例程一起工作,以獲得我想要的功能。這是我到目前爲止。有在某些時候一個倒數計時器停止,並要求輸入

print "Enter password: "; 
my $password = <STDIN>; 
chomp($password); 

if ($password eq "password") { 
    &counter; 
} else { 
    print "bad"; 
} 

sub counter { 
    our $countdown = 60; 

    while ($countdown > 0) { 
     $countdown--; 
     &check; 
     print "$countdown\n"; 
    } 
} 

sub check { 
    if (our $countdown = (50, 40, 30, 20, 10)) { 
     print "Enter password: "; 
     my $password = <STDIN>; 
     chomp($password); 
    } 
    if ($password eq "password") { 
     &counter; 
    } else { 
     print "bad"; 
    } 
} 
+2

見http://stackoverflow.com/questions/19732221/how-to-pause-real-time-in-perl – 2014-09-21 18:07:25

回答

1

PythonMaster的答案是好的,但它忽略了,這是一個Perl的問題

$|++; # unbuffered output 
my $counter = 60; 
my $passed; 
while ($counter) { 
    $counter--; 
    print "$counter...\cm"; 
    if (not $counter % 10) { 
     last if $passed = check(); 
    } 
    sleep 1; 
} 
print "\n"; 
print "All password attempts failed!\n" unless $passed; 

sub check { 
    print "\nEnter password: "; 
    my $password = <STDIN>; 
    chomp($password); 
    return $password eq "password"; 
} 

注:

  • $| unbuffers標準輸出,如果它是一個非零值。由於我們希望看到倒計時輸出,因此我們需要取消緩衝STDOUT。
  • 的鍵位使用模運算來決定,當我們在10(模數爲零時,這是真的多,因爲零是Perl中的一個「假」值,我們not,爲了得到一個表達式當模量爲零是真的
  • check()簡化爲簡單地返回比較的結果。如果這是真的,那麼函數返回真值,否則,返回false
  • last if $passed = check()做三重責任:。如果檢查密碼,這樣可以節省的價值,並結束循環,如果密碼是OK。
  • 額外"\n"字符用於兩個下降密碼提示到n分機線,並確保最後的「失敗」消息出現在自己的路線上。
  • "\cm"使倒數停留在同一行,直到出現密碼提示。

編輯:以上的評論鏈接到該解決方案是比這更好。