循环中的Term :: ReadKey会停止封闭循环

时间:2011-10-11 05:59:44

标签: perl

我有一个有效的循环。我想捕获该循环中的击键,但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);
}

1 个答案:

答案 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的文档。如果你看的话,我在这里讨论的大部分内容都是为了阅读。