刷新Perl STDIN缓冲区

mcw*_*lig 10 perl buffer stdin flush

有没有办法清除Perl中的STDIN缓冲区?我的程序的一部分有很长的输出(有足够的时间让某人输入几个字符)并在输出之后我要求输入,但是如果在输出期间输入了字符,它们将被"添加"到输入中输入的任何内容部分.这是我的问题的一个例子:

for(my $n = 0; $n < 70000; $n++){
   print $n . "\n";
}
chomp(my $input = <STDIN>);
print $input . "\n";
Run Code Online (Sandbox Code Playgroud)

输出将包括从for循环输出期间输入的任何字符.我怎么能禁用STDIN或刷新STDIN缓冲区(或任何其他方式不允许额外的字符在调用之前插入STDIN)?

Can*_*ice 13

看起来您可以使用Term::ReadKey模块完成此操作:

#!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'";
Run Code Online (Sandbox Code Playgroud)

这是发生的事情:

  • ReadMode 2表示"将输入模式置于常规模式但关闭回声".这意味着当您使用计算成本高昂的代码时,用户所做的任何键盘敲击都不会回显到屏幕上.它仍然会进入STDIN缓冲区,所以......
  • ReadMode 3变成STDINcbreak模式,意味着STDIN在每次按键后都会被刷新.这就是为什么...
  • while(defined($key = ReadKey(-1))) {}发生.这将清除用户在计算代价高昂的代码中输入的字符.然后...
  • ReadMode 0重置STDIN,您可以读取,STDIN就好像用户没有敲击键盘.

当我运行此代码并在键盘上敲击时sleep(10),然后在提示后输入一些其他文本,它只打印出我出现提示后输入的文本.

严格来说,ReadMode 2不需要,但我把它放在那里,以便当用户敲击键盘时屏幕不会弄乱文本.