2012-11-10 53 views
1

當我Enter a string:例如abc後類型,然後兩次按Ctrl +d我得到一個無限循環不上ReadKey叫停而我不能停止與Q關鍵?期限:: ReadKey, 「STRG + d」 和STDIN

#!/usr/bin/env perl 
use warnings; 
use 5.10.1; 
use Term::ReadKey; 

while(1) { 
    my $c; 
    say "Press the \"q\" key to quit."; 
    print "Press the \"e\" key to enter a string: "; 
    { 
     $|++; 
     Term::ReadKey::ReadMode 'ultra-raw'; 
     $c = ReadKey 0; 
     Term::ReadKey::ReadMode 'restore';   
    } 
    exit if ord($c) == 3; # Control C 
    last if $c eq 'q'; 
    if ($c eq 'e') { 
     print "\nEnter a string: "; 
     my $string = <>; 
     if (not defined $string) { 
      say "Undefined"; 
     } 
     else { 
      chomp $string; 
      say "You entered |$string|"; 
     } 
    } 
    say "Still running"; 
} 

回答

2

在鍵入兩個按Ctrl - d(EOT),您PROGRAMM只會收到NUL字節。而他們的無限。不幸的是,你有無限循環無條件閱讀。你可以改變它(例如,如果用戶輸入的內容不是qe,如果他在第三次嘗試後沒有得到它,請退出),或者正確實施控制字符。你甚至可以在之前去除輸入中的所有控制字符,但它提供了必要的掛鉤。我強烈建議您添加Ctrl - C(它只適用於預期行時,而不是字符正在讀取時)。

此外,爲什麼不比較輸入字符與字符串相等? $c eq "q"閱讀更好。

+0

我怎麼能抓住'Ctrl'-'D'? –

0

,將終止你的循環的唯一線路是這樣的一個:

last if ord($c) == 113; 

所以,爲了躲避循環的唯一方法是進入「Q」當提示你輸入「E 」。

想必您在if語句中放置了合適的last,以便ctrl-d和/或任何文本都會終止。