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";
}