簡體   English   中英

循環中的Term :: ReadKey停止封閉的循環

[英]Term::ReadKey within a loop halts the enclosing loop

我有一個while循環有效。 我想捕獲該循環內的擊鍵,但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);
}

從您的問題和發布的代碼中,您並不清楚要完成的工作。 一方面,這個問題聽起來像是您正在嘗試進行非阻塞閱讀。 如果是這種情況,那么您可能想要在內部循環中使用更多類似的內容:

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'); 在程序結束時,按Enter不會給我終端顯示新行。 該模塊在終止后似乎並沒有清除,因此您必須明確地執行此操作。

您還應該查看Term :: ReadKey的文檔。 如果您願意的話,我在這里討論的大多數內容都在這里供您閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM