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