簡體   English   中英

Term::ReadKey, "Strg+D" 和 STDIN

[英]Term::ReadKey, "Strg+D" and STDIN

當我在Enter a string:Enter a string:例如abc ,然后兩次Ctrl + D我得到一個無限循環,它不會在ReadKeyReadKey並且我不能用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";
}

鍵入兩個Ctrl - D (EOT) 后,您的程序將只接收 NUL 字節。 和無窮無盡的。 不幸的是,您在無限循環中進行了無條件讀取。 要么更改它(例如,如果用戶鍵入qe以外的內容,則給他一個教訓,如果他在第三次嘗試后沒有得到它,則退出),或者正確實現控制字符。 您的模塊您獲得輸入之前就從輸入中去除了所有控制字符,但它提供了必要的掛鈎。 我敦促您也添加Ctrl - C (它僅在需要一行時起作用,而不是在讀取字符時起作用)。

另外,為什么不將輸入字符與字符串相等進行比較? $c eq "q"讀起來更好。

將終止循環的唯一行是這一行:

last if ord( $c ) == 113;

因此,逃避循環的唯一方法是在提示要求您輸入“e”時輸入“q”。

大概您希望在if語句中適當地放置last ,以便 ctrl-d 和/或任何文本將終止。

暫無
暫無

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

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