Perl术语:ReadKey don';Don’不要等新线

Perl术语:ReadKey don';Don’不要等新线,perl,Perl,在perl脚本中,我尝试在不阻塞和不回显输入字符的情况下接受输入(脚本正在生成输出,我希望使用“热键”来改变其行为) 我尽可能地使用 use Term::ReadKey; ReadMode( "cbreak", STDIN ); if($input = ReadKey($pause_time, STDIN)){ #process input } 但一旦用户键入任何内容,脚本就会停止,直到输入换行符。我希望在不等待换行的情况下,按字符处理输入。这里有一个小程序,可以满足您的要求: #!/

在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;
}
#/usr/bin/perl
严格使用;
使用警告;
使用Term::ReadKey;
阅读模式4;
结束{ReadMode 0}

print我本来想把这个作为对你自己“答案”的评论,但我决定需要更多的空间

cbreak与原始模式等效,不同之处在于cbreak不截取ctrl-c、ctrl-z等控制序列。它们都一次收集一个字符。这两种模式之间的行为差异并不是问题的根源。如果Chas的解决方案符合您的预期,那么问题很可能与您在
#流程输入
行中编辑的内容有关。我已经说过,如果我用一些基本的东西来填充你的原始脚本,那么它就可以正常工作。例如,小补漆:

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
中抛出回车符并扭曲字符串)。

在Windows XP SP3上使用命令提示符,在ActivePerl 5.10.0 Build 1004下对我来说很好。您是将Cygwin与ActivePerl(危险的组合!)还是Linux一起使用?这里也一样。程序在键入第一个字符后退出。这是你想要的吗?