我有一个有效的循环。我想捕获该循环中的击键,但ReadKey例程会停止封闭循环。我做错了什么?
#!/usr/bin/perl
use strict;
use warnings;
use Term::ReadKey;
my $char;
while(1 < 5) {
print time . "\n";
while(1) {
ReadMode('raw');
$char = ReadKey(0);
print "Got $char\n";
}
sleep(5);
}
答案 0 :(得分:1)
从您的问题和您发布的代码中找到的内容并不完全清楚。一方面,问题听起来好像是在试图获得非阻塞读取。如果是这种情况,你可能想要一些更像这样的内循环:
while(1) {
ReadMode('cbreak');
my $char = ReadKey(-1);
next unless defined($char);
print "Got $char\n";
last if $char eq "\t";
}
ReadKey(-1)设置非阻塞读取,这意味着它不等待输入;它只是告诉你输入是什么,如果有的话,然后继续下一次迭代。如果没有输入则返回undef。您会注意到我将ReadMode切换为'cbreak',以便进行测试,以便在我准备终止时轻松点击CTRL-C。点击选项卡也将在此示例代码中终止。由于ReadMode()设置为-1,因此对于非阻塞,我们只是保持循环。
您的代码也存在“while( 1 < 5 )
”的问题。你认为这对你有什么好处? 1始终小于5,因此循环永远不会终止。如果你真的想要一个无休止的循环,只需说while(1)
所以我们知道你知道你的意思。另一方面,我考虑过你真正打算说while( $i++ < 5 )
这样的可能性,以便你至少可以获得外循环的五次迭代。
最后一点说明。无论你设置了什么“ReadMode”,你都应该在退出程序之前调用“ReadMode('restore')
”,否则你的终端可能仍然“愚蠢”。例如,在我的节目中,如果没有在程序的末尾添加ReadMode('restore');
,点击输入将不会在我的终端中给我一个新行。此模块在终止后似乎没有自行清理,因此您必须明确地执行此操作。
您还应查看Term::ReadKey的文档。如果你看的话,我在这里讨论的大部分内容都是为了阅读。