刷新Perl STDIN缓冲区

刷新Perl STDIN缓冲区,perl,buffer,stdin,flush,Perl,Buffer,Stdin,Flush,有没有办法在Perl中清除STDIN缓冲区?我的程序的一部分有很长的输出(有足够的时间让人输入几个字符),输出后我要求输入,但如果在输出过程中输入了字符,它们将“附加”到输入部分输入的任何内容上。下面是我的问题的一个例子: for(my $n = 0; $n < 70000; $n++){ print $n . "\n"; } chomp(my $input = <STDIN>); print $input . "\n"; for(my$n=0;$n

有没有办法在Perl中清除STDIN缓冲区?我的程序的一部分有很长的输出(有足够的时间让人输入几个字符),输出后我要求输入,但如果在输出过程中输入了字符,它们将“附加”到输入部分输入的任何内容上。下面是我的问题的一个例子:

for(my $n = 0; $n < 70000; $n++){
   print $n . "\n";
}
chomp(my $input = <STDIN>);
print $input . "\n";
for(my$n=0;$n<70000;$n++){
打印$n。“\n”;
}
chomp(我的$input=);
打印$input。“\n”;

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

看起来您可以通过模块完成这一点:

#!perl
严格使用;
使用警告;
使用5.010;
使用Term::ReadKey;
说“我开始睡觉了……”;
阅读模式2;
睡眠(10);
阅读模式3;
我的$key;
而(已定义($key=ReadKey(-1)){}
读取模式0;
说“输入某物:”;
chomp(我的$input=);
说“您输入了“$input”;
下面是发生的情况:

  • ReadMode 2
    表示“将输入模式置于常规模式,但关闭回波”。这意味着,当你在计算昂贵的代码中时,用户所做的任何键盘敲击都不会在屏幕上得到回应。它仍然会被输入到STDIN的缓冲区中,所以
  • ReadMode 3
    STDIN
    转换为cbreak模式,这意味着
    STDIN
    在每次按键后都会被刷新。这就是为什么
  • while(defined($key=ReadKey(-1)){}
    。这将清除用户在计算代价高昂的代码中输入的字符。然后
  • ReadMode 0
    重置
    STDIN
    ,您可以从
    STDIN
    读取,就像用户没有敲击键盘一样
当我在
睡眠(10)
期间运行此代码并敲击键盘,然后在提示后输入其他文本时,它只打印出提示出现后我键入的文本

严格地说,
ReadMode 2
是不需要的,但我把它放在那里,这样当用户敲击键盘时,屏幕上就不会被文本弄得乱七八糟了。

{local$/;}
{ local $/; <STDIN> }
这暂时限制在块的范围内,将输入记录分隔符$/设置为未定义,它告诉perl只读取所有内容,而不是一次读取一行。然后读取STDIN上的所有可用内容,而不对其执行任何操作,从而刷新缓冲区


之后,您可以正常读取STDIN。

我也遇到了同样的问题,通过如下处理后丢弃STDIN中的任何内容来解决:

for(my $n = 0; $n < 70000; $n++){
  print $n . "\n";
}
my $foo=<STDIN>;
print "would you like to continue [y/n]: ";
chomp(my $input = <STDIN>);
print $input . "\n";
for(my$n=0;$n<70000;$n++){
打印$n。“\n”;
}
我的$foo=;
打印“是否继续[y/n]:”;
chomp(我的$input=);
打印$input。“\n”;

好的,我已经寻找这个问题的答案3天了(不是每天每小时,但我会说每天至少3或4小时),但还没有找到答案,事实上我问过我的同事,他们也知道并使用Perl,但他们也不知道,所以我相信我付出的努力比你们所暗示的要多,抛开这一点,你们知道如何做到我所要求的吗?因为大约3天前,我已经浏览了您的链接,尝试以逻辑上解决此问题的方式实现这些函数,但没有成功。
use IO::Handle;标准输入->自动刷新(1)谢谢您的回答,但是,这并没有解决问题,而且,我确实记得阅读autoflush和flush仅适用于输出,例如STDERR和STDOUT,而不适用于输入。当我尝试您建议的方法时,我仍然会得到在for循环输出过程中输入的字符加上我在STDIN中输入的字符。@JackManey:通常,“刷新”应用于输出,而不是输入。这不起作用。
调用将阻塞,直到可以读取“记录”。但是,如果
$/
未定义的
,则记录不会有结尾,因此它将阻止,直到达到EOF。--刚刚意识到,这仅在处理过程中有返回时有效,否则它将暂停,直到有人点击enter
for(my $n = 0; $n < 70000; $n++){
  print $n . "\n";
}
my $foo=<STDIN>;
print "would you like to continue [y/n]: ";
chomp(my $input = <STDIN>);
print $input . "\n";