刷新 Perl STDIN 缓冲区

2023-11-26

有没有办法清除 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(使用前将#替换为@)

刷新 Perl STDIN 缓冲区 的相关文章

随机推荐

  • 了解 iBeacon 数据:功率字段和其他字节

    我是蓝牙系统的新手 我正在尝试了解新的苹果技术 iBeacon 使用的数据 已经有一些很好的答案解释了它是如何工作的 我一直在阅读我能找到的所有内容 特别是蓝牙规范 尽管如此 我仍然遗漏了一些要点 我将首先举一个例子 我正在使用设置广告数据
  • 如何在linux中使用cx_freeze创建要在windows中使用的包

    如何在 Linux 中使用 cx freeze 创建一个可在 Windows 中使用的包 如 exe 或 bin 文件 我在 Linux 中测试了 cx freeze 但在 Linux 和 Windows 中制作软件包是未知的 例如 cxf
  • 将 VB.NET Winforms 应用程序移植到 C#

    是否有任何 好的 资源可将 VB NET winforms 应用程序移植到 C 我确信有软件可以翻译代码 但我希望同时重构代码 保持当前的形式是有问题的 因为它使用了 VB NET 允许的一些 不良设计 实践 并且会使未来的维护进一步复杂化
  • 如果 chrome 开发工具打开,AJAX 可以工作,但如果 chrome web 工具关闭,AJAX 就不行?

    我正在通过 ajax 加载 json 文件 如果 Chrome 开发工具打开 一切都会完美运行 如果 Chrome 开发工具关闭 则会失败 值得庆幸的是 即使关闭时 开发工具仍然会继续做它的事情 所以我仍然可以看到我得到的异常 Failed
  • C#:枚举中的按位运算符(MVC 中的自定义授权)

    我目前正在阅读一篇文章 但我不太明白这是如何与逻辑运算符一起使用的 谁能向我解释一下吗 例如 如果我想与客户 员工 主管和管理员建立 4 级证券 Serializable Flags public enum WebRoles custome
  • UnsatisfiedLinkError:java.library.path中没有opencv_java249

    在我的 Mac 上运行一段代码时遇到一些问题 有人给我写了一个图像分析 java 应用程序 但当我尝试在 netbeans 上运行它时 我不断收到此错误 运行 线程 主 java lang UnsatisfiedLinkError 中出现异
  • Guava 中有类似 Function Java 的 Effect 的东西吗?

    我知道纯函数式编程的目标之一是消除可变性 从而排除副作用 但让我们面对现实吧 即使存在所有函数式编程库 Java 也不是一种函数式语言 事实上 一些 FP 图书馆似乎知道并期望这一点 例如 在函数式 Java 中 有Effect班级 在 J
  • C 中带符号和无符号变量的环绕解释?

    我在 C 规范中读到了一些无符号变量 特别是无符号短int 执行一些所谓的环绕关于整数溢出 尽管我在有符号变量上找不到任何东西 除了我留下的未定义的行为 我的教授告诉我 他们的价值观也被包裹起来 也许他只是指海湾合作委员会 我认为这些位只是
  • 删除由 ::before 伪选择器添加的元素

    我有以下情况 样式是在SASS中完成的 并且省略了不必要的样式 header before position absolute height 0 5rem 这会在应用程序的菜单栏顶部创建一个栏 在某些情况下 必须删除该栏 我读过类似的问题t
  • 如何更新sql server中的前100条记录

    我想更新 SQL Server 中的前 100 条记录 我有一张桌子T1有字段F1 and F2 T1有200条记录 我想更新F1字段中的前 100 条记录 我怎样才能根据TOP 100在 SQL Server 中 注意 括号是必需的UPD
  • Spring boot可以根据属性文件的内容动态创建端点吗?

    到目前为止 我正在创建这样的端点 RequestMapping value test method RequestMethod POST public ResponseBody String indexPost HttpServletReq
  • 用于获取整棵树的 JPA 查询

    我有一个类对所有类别进行建模 并且它们可以按层次结构排序 Entity Table name categories public class Category Id GeneratedValue strategy GenerationTyp
  • 泽西岛多种农产品

    我正在关注球衣教程here弄清楚如何产生多个哑剧输出 从他们的网站来看 这是推荐的方式 GET Produces application xml application json public String doGetAsXmlOrJson
  • 当 pppd 处于活动状态时向 SIM900 发送 AT 命令

    我有一个连接了 SIM900 GSM 附加板的 Raspberry Pi 我已成功与以下设备建立 GPRS 连接pppd依照指示本指南 针对不同的GSM模块 但步骤是相同的 我想定期发送一条 AT 命令 AT CCLK 到SIM900检查时
  • 如何批量上传大文件?

    我有一个小文件共享网页 可以免费使用它 我想上传 0mb 到 1GB 之间的文件 我已经用谷歌搜索了两天了 但找不到任何我需要的东西 我的网页 http boxy tigyisolutions hu不过我现在只能上传20 30mb 我想一次
  • MySQL 查询调优 - 为什么使用变量中的值比使用文字慢得多?

    更新 我自己在下面回答了这个问题 我正在尝试解决 MySQL 查询中的性能问题 我认为我看到的是 将函数的结果分配给变量 然后运行 SELECT 并与该变量进行比较相对较慢 然而 如果为了测试的目的 我将与变量的比较替换为与我知道该函数将返
  • 多部分上传文件servlet [重复]

    这个问题在这里已经有答案了 如何上传文件并获取表单的其他参数 我想在 Java servlet 中处理多部分请求 要浏览并选择要上传的文件 您需要
  • “访问已处理的关闭”是什么意思?

    我有以下代码 public void DequeueRecipe AuthIdentity identity params Guid recipeIds using var session GetSession var recipes fr
  • System.Data.OleDb.OleDbException: 无效的 Internet 地址。如何使用 OleDb 连接到位于网络服务器上的 Excel 文件

    我正在尝试创建与 SharePoint 服务器上的 Excel 文件的 OleDb 连接 我现在正在使用的示例代码抛出 OleDb 异常 无效的互联网地址 public static void ConnectToRemoteExcelFil
  • 刷新 Perl STDIN 缓冲区

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