1

Enter a string:例如a,当我键入, bc然后两次Ctrl+D我得到一个无限循环,它不会停止ReadKey并且我不能用Q键停止?

#!/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";
}
4

2 回答 2

2

键入两个Ctrl- D(EOT) 后,您的程序将只接收 NUL 字节。还有无数个。不幸的是,您在无限循环中进行了无条件读取。要么你改变它(例如,如果他输入了其他内容,给用户一个教训,q或者e如果他在第三次尝试后没有得到它,则退出),或者你正确地实现控制字符。您的模块甚至在您获得输入之前就从输入中删除了所有控制字符,但它提供了必要的钩子。我敦促您添加Ctrl-C以及(它仅在需要一行时才有效,而不是在读取 char 时)。

另外,为什么不将输入字符与字符串相等性进行比较?$c eq "q"读起来更好。

于 2012-11-10T11:32:17.507 回答
0

将终止循环的唯一行是这一行:

last if ord( $c ) == 113;

因此,退出循环的唯一方法是在提示要求您输入“e”时输入“q”。

last大概您希望在语句中适当放置一个if,以便 ctrl-d 和/或任何文本将终止。

于 2012-11-10T11:29:24.763 回答