有没有办法清除 Perl 中的 STDIN 缓冲区?我的程序的一部分有很长的输出(有足够的时间让某人输入几个字符),在输出之后我要求输入,但是如果在输出期间输入了字符,它们将被“附加”到输入中输入的任何内容上部分。这是我的问题的一个例子:
for(my $n = 0; $n < 70000; $n++){
print $n . "\n";
}
chomp(my $input = <STDIN>);
print $input . "\n";
输出将包括在 for 循环输出期间输入的任何字符。我怎样才能禁用 STDIN 或刷新 STDIN 缓冲区(或任何其他方式不允许在调用 STDIN 之前将额外的字符插入到 STDIN 中)?
看起来你可以用Term::ReadKey module:
#!perl
use strict;
use warnings;
use 5.010;
use Term::ReadKey;
say "I'm starting to sleep...";
ReadMode 2;
sleep(10);
ReadMode 3;
my $key;
while( defined( $key = ReadKey(-1) ) ) {}
ReadMode 0;
say "Enter something:";
chomp( my $input = <STDIN> );
say "You entered '$input'";
发生的情况如下:
-
ReadMode 2
意思是“将输入模式置于常规模式但关闭回显”。这意味着,当您使用计算量大的代码时,用户敲击键盘的任何操作都不会回显到屏幕上。它仍然被输入STDIN
的缓冲区,所以...
-
ReadMode 3
turns STDIN
进入cbreak模式,意思是STDIN
每次按键后都会被刷新。这就是为什么...
-
while(defined($key = ReadKey(-1))) {}
发生。这会清除用户在计算成本较高的代码中输入的字符。然后...
-
ReadMode 0
resets STDIN
,你可以阅读STDIN
就好像用户没有敲击键盘一样。
当我运行这段代码并敲击键盘时sleep(10)
,然后在提示后输入一些其他文本,它只打印出我在提示出现后输入的文本。
严格来说ReadMode 2
不需要,但我把它放在那里,这样当用户敲击键盘时,屏幕就不会被文本弄乱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)