Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 术语::ReadKey;Strg&x2B;D";和标准_Perl_Stdin_Eof_Readkey - Fatal编程技术网

Perl 术语::ReadKey;Strg&x2B;D";和标准

Perl 术语::ReadKey;Strg&x2B;D";和标准,perl,stdin,eof,readkey,Perl,Stdin,Eof,Readkey,当我在之后输入一个字符串时:例如a,b,c,然后按Ctrl+D两次,我会得到一个无休止的循环,它不会在ReadKey上停止,我不能用Q键停止 #/usr/bin/env perl 使用警告; 使用5.10.1; 使用Term::ReadKey; 而(1){ 我的$c; 说“按“q”键退出。”; 打印“按\“e\”键输入字符串:”; { $|++; 术语::ReadKey::ReadMode“超原始”; $c=ReadKey 0; 术语::ReadKey::ReadMode“还原”; } 如果or

当我在
之后输入一个字符串时:
例如
a
b
c
,然后按Ctrl+D两次,我会得到一个无休止的循环,它不会在
ReadKey
上停止,我不能用Q键停止

#/usr/bin/env perl
使用警告;
使用5.10.1;
使用Term::ReadKey;
而(1){
我的$c;
说“按“q”键退出。”;
打印“按\“e\”键输入字符串:”;
{
$|++;
术语::ReadKey::ReadMode“超原始”;
$c=ReadKey 0;
术语::ReadKey::ReadMode“还原”;
}
如果ord($c)=3,则退出;控制c
最后一个if$c eq‘q’;
如果($c等式'e'){
打印“\n输入字符串:”;
我的$string=;
if(未定义$string){
说“未定义”;
}
否则{
chomp$string;
说“您输入了|$string |”;
}
}
说“还在跑”;
}

终止循环的唯一一行是:

如果ord($c)==113,则为最后一次;
因此,跳出循环的唯一方法是在提示符要求您输入“e”时输入“q”

大概您希望在
if
语句中适当地放置
last
,这样ctrl-d和/或任何文本都将终止。

键入两个ctrl-d(EOT)后,您的程序将只接收NUL字节。它们是无限的。不幸的是,在无限循环中有一个无条件读取。您可以更改此设置(例如,如果用户键入的不是
q
e
的内容,则给用户上一课,如果用户在第三次尝试后没有得到,则退出),或者您可以正确地执行控制字符。您的模块甚至在获得输入之前就从输入中去除了所有控制字符,但它提供了必要的挂钩。我建议您也添加Ctrl-C(它仅在需要一行时有效,而不是在读取字符时有效)


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

我怎样才能抓住
Ctrl
-
D
#!/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";
}