簡體   English   中英

Perl Term :: ReadKey不等待換行符

[英]Perl Term::ReadKey don't wait for newline

在perl腳本中,我試圖接受輸入而不阻塞並且不回顯輸入的字符(腳本正在生成輸出,我希望有'熱鍵'來改變它的行為)。

我得到了使用

use Term::ReadKey;
ReadMode( "cbreak", STDIN );
if($input = ReadKey($pause_time, STDIN)){
    #process input
}

但是一旦用戶鍵入任何內容,腳本就會停止,直到輸入換行符。 我希望每個字符處理輸入,而不必等待換行符。

這是一個小程序,可以滿足我的需求:

#!/usr/bin/perl

use strict;
use warnings;

use Term::ReadKey;

ReadMode 4;
END { ReadMode 0 }

print <<EOS;
q to quit
b to print in binary
o to print in octal
d to print in decimal
x to print in hexadecimal
EOS

my $control = "d";
my $i       = 0;
while (1) {
    #use "if" if you want to have a buffer of commands
    #that will be processed one per second  
    while (defined (my $key = ReadKey(-1))) {
        exit 0          if $key eq 'q';
        $control = $key if $key =~ /^[bodx]$/;
    }
    printf "%$control\n", $i++;
    sleep 1;
}

我打算將此作為對你自己“答案”的評論,但我決定需要更多空間。

cbreak相當於原始模式,除了cbreak不攔截控制序列,如ctrl-c,ctrl-z等。它們一次收集一個字符。 兩種模式之間的行為差​​異不是您的問題的根源。 如果Chas的解決方案做了類似你想要的事情,那么問題更可能與你在#process input行中編輯的任何內容有關。 我已經評論過你的原始腳本工作得很好,如果我用一些簡單的東西填充它,所以我可以看到它正在工作。 例如,一個小修飾:

use strict;
use warnings;
use Term::ReadKey;

my ($char, $input, $pause_time);
ReadMode("cbreak");

# Collect all characters typed into $input
# and quit when '#' is typed.

$input = '';
while ($char = ReadKey($pause_time)) {
    last if $char eq '#';
    $input .= $char;
}

print "$input\n";

我不需要在此結束時點擊“輸入”,這樣做不會做任何事情(除了將回車投入$input並對字符串進行調整)。

暫無
暫無

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

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