当我在Enter a string:
后输入a
,b
,c
,然后两次 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";
}
答案 0 :(得分:2)
键入两个 Ctrl - D (EOT)后,您的程序将只接收NUL字节。而且无穷无尽。不幸的是,你在无限循环中无条件读取。要么改变它(例如,如果他键入q
或e
以外的其他内容,请给用户上课,如果他在第三次尝试后没有得到它,则退出),或者正确实现控制字符。你的模块在输入之前删除所有控制字符你甚至得到它,但它提供了必要的钩子。我还建议您添加 Ctrl - C (它只适用于预期的行,而不是在读取字符时)。
另外,为什么不将输入字符与字符串相等进行比较? $c eq "q"
读得更好。
答案 1 :(得分:0)
终止你的循环的唯一一行就是这一行:
last if ord( $c ) == 113;
因此,逃避循环的唯一方法是在提示要求您输入“e”时输入“q”。
据推测,您希望在last
语句中放置if
,以便ctrl-d和/或任何文本终止。