2012-11-10 27 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和/或任何文本都会终止。