Term :: ReadKey,“Strg + D”和STDIN

时间:2012-11-10 09:10:19

标签: perl stdin eof readkey

当我在Enter a string:后输入abc,然后两次 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";
}

2 个答案:

答案 0 :(得分:2)

键入两个 Ctrl - D (EOT)后,您的程序将只接收NUL字节。而且无穷无尽。不幸的是,你在无限循环中无条件读取。要么改变它(例如,如果他键入qe以外的其他内容,请给用户上课,如果他在第三次尝试后没有得到它,则退出),或者正确实现控制字符。你的模块在输入之前删除所有控制字符你甚至得到它,但它提供了必要的钩子。我还建议您添加 Ctrl - C (它只适用于预期的行,而不是在读取字符时)。

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

答案 1 :(得分:0)

终止你的循环的唯一一行就是这一行:

last if ord( $c ) == 113;

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

据推测,您希望在last语句中放置if,以便ctrl-d和/或任何文本终止。