如何在 Perl 中获取用户输入而不等待输入?

2024-06-25

我正在尝试用 Perl 制作一个交互式 shell 脚本。

我能找到的唯一用户输入如下:

 $name = <STDIN>;
 print STDOUT "Hello $name\n";

但在此用户必须始终按 Enter 键才能使更改生效。 如何让程序在按下按钮后立即继续运行?


From perlfaq8 http://faq.perl.org/perlfaq8.html的回答如何只读取一个键而不等待返回键? http://faq.perl.org/perlfaq8.html#How_do_I_read_just_o:


控制输入​​缓冲是一个非常依赖于系统的问题。在许多系统上,您可以只使用 stty 命令,如 perlfunc 中的 getc 所示,但如您所见,这已经让您遇到了可移植性障碍。

open(TTY, "+</dev/tty") or die "no tty: $!";
system "stty  cbreak </dev/tty >/dev/tty 2>&1";
$key = getc(TTY);       # perhaps this works
# OR ELSE
sysread(TTY, $key, 1);  # probably this does
system "stty -cbreak </dev/tty >/dev/tty 2>&1";

CPAN 的 Term::ReadKey 模块提供了一个易于使用的界面,该界面应该比为每个密钥向 stty 敲击更有效。它甚至包括对 Windows 的有限支持。

use Term::ReadKey;
ReadMode('cbreak');
$key = ReadKey(0);
ReadMode('normal');

但是,使用该代码需要您有一个可用的 C 编译器,并且可以使用它来构建和安装 CPAN 模块。这是使用标准 POSIX 模块的解决方案,该模块已在您的系统上(假设您的系统支持 POSIX)。

use HotKey;
$key = readkey();

这里是 HotKey 模块,它隐藏了一些令人费解的调用来操作 POSIX termios 结构。

# HotKey.pm
package HotKey;

@ISA = qw(Exporter);
@EXPORT = qw(cbreak cooked readkey);

use strict;
use POSIX qw(:termios_h);
my ($term, $oterm, $echo, $noecho, $fd_stdin);

$fd_stdin = fileno(STDIN);
$term     = POSIX::Termios->new();
$term->getattr($fd_stdin);
$oterm     = $term->getlflag();

$echo     = ECHO | ECHOK | ICANON;
$noecho   = $oterm & ~$echo;

sub cbreak {
    $term->setlflag($noecho);  # ok, so i don't want echo either
    $term->setcc(VTIME, 1);
    $term->setattr($fd_stdin, TCSANOW);
}

sub cooked {
    $term->setlflag($oterm);
    $term->setcc(VTIME, 0);
    $term->setattr($fd_stdin, TCSANOW);
}

sub readkey {
    my $key = '';
    cbreak();
    sysread(STDIN, $key, 1);
    cooked();
    return $key;
}

END { cooked() }

1;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Perl 中获取用户输入而不等待输入? 的相关文章

随机推荐

  • 符号问题 - 无法进入 .NET 代码

    我无法使 Visual Studio 2010 SP1 进入任何 NET Framework 类 我在互联网上找到了很多指南 但没有一个有效 这是输出窗口的内容 Step into Stepping over method without
  • 如何在 log4net 附加程序名称中使用 GlobalContext 属性?

    我正在尝试自定义 log4net 文件路径以使用我在log4net GlobalContext Properties字典 log4net GlobalContext Properties LogPathModifier SomeValue
  • Rails 可安装引擎的 prepend_view_path

    一方面 我有一个可安装的发动机 比如说前轮 前面包含我的资产和几页 它与 MainApp 隔离 我不想让它触及主应用程序 另一方面 我希望我的 MainApp 使用布局和部分前端 所以我这样设置布局 class ApplicationCon
  • 使用具有来自平面数字数组的最大和的子数组填充数组

    我需要填充一个数组 其中可能包含不确定数量的子数组 托盘 每个子数组的最大尺寸为 265 厘米 我有一个整数 包 的平面数组 需要在托盘中进行最佳排列 例如 50 厘米 45 厘米 30 厘米 如何动态创建一个系统来创建代表具有最佳空间优化
  • Java 中 Math.floorDiv 的 ceil 对应部分?

    有没有ceil对应的Math floorDiv http docs oracle com javase 8 docs api java lang Math html floorDiv long long 如何用我们现有的最快方法计算它 UP
  • RcppArmadillo 传递用户定义函数

    考虑以下 R 代码 R version caller lt function x 1 3 fun identity do some other stuff then call the function eval call fun x fun
  • 将数据添加到数据库(相关表)Spring Boot

    我英语很差 但我正在尝试描述我的问题 我是春天的新人 我在向数据库添加数据时遇到一些问题 我必须表 PC 和 PC 特征 它们通过 Id 关联 在非关联表中添加数据很容易 但是如何在关联表中添加数据呢 我应该在控制器中写什么 下面有一些类
  • 您可以将 Apple 的 Mapkit 用于混合应用程序吗?

    此 Web 应用程序适用于 Web 和 Android 我研究了谷歌等其他公司 但他们也有局限性 如果您可以使用它 任何人都可以向我指出它的文档 Thanks 2019年更新 Apple 现在拥有用于在网络上使用 Apple 地图的第一方
  • 菜单中的图标比应有的小

    SOLVED 我使用的是 sdk v9 Android 2 3 Gingerbread 中的图标 它似乎有不同的尺寸 asset studio 还为 2 3 创建了图标 因此 我将姜饼图标放置到了drawable xxpi v9中 对于旧版
  • 扫描仪未读取整个句子

    扫描仪未读取整个句子 或者假设我正在编写一种方法 可以颠倒句子中的单词 同时保持它们在句子中的顺序 public static String reverse String s String revStr for int a s length
  • 将纬度/经度转换为像素并返回

    我在我的应用程序中使用谷歌地图 并且我有一个网络服务器 其中的数据库填充了纬度 经度值 我想在地图上标记它们 但如果它们彼此之间在一定的像素距离内 我也想将它们聚集在一起 我想如果我从数据库中检索所有的点 我应该能够做这样的事情 伪代码 c
  • 使用 python datetime 从星期几和日期推断年份

    我有以下形式的数据Thu Jun 22 09 43 06我想从中推断出年份以供使用datetime计算两个日期之间的时间 有没有办法使用datetime根据上述数据推断年份 不 但如果您知道范围 例如 2010 2017 您可以迭代多年 看
  • 使用 jQuery 导入 XML:在服务器上运行,而不是在本地运行

    我正在编写一个读取 XML 文件然后输出数据的脚本 当它在我的网络服务器上运行时它可以完美地工作 但不能从我的本地计算机上运行 542Data xml 文件与服务器和我的计算机上的HTML页面存储在同一文件夹中 我检查了所有文件版本是否相同
  • 当我运行 rake:db migrate 命令时,出现错误“未初始化常量 CreateArticles”

    我创建了一个模型 ruby 脚本 生成模型文章 简单就够了 这是迁移文件create articles rb def self up create table articles do t t column user id integer t
  • DataGrid 是 WPF 中的必需品吗?

    我看到很多讨论正在进行 人们询问 WPF 的 DataGrid 并抱怨 Microsoft 迄今为止还没有在其 WPF 框架中提供 DataGrid 我们知道 WPF 是一项出色的 UI 技术 并且具有 ItemsControl DataT
  • getActivity() 与 FragmentActivity: android

    我正在使用这个类 A 它扩展了另一个抽象类 并且这个抽象类扩展了 FragmentActivity 并且在 A 类中的一个函数中 我想为我当前的活动 A 获取 getActivity 但是每当我使用 getActivity 时 它都会给出我
  • 在Service中使用Looper和使用单独的线程是一样的吗?

    在此示例中 来自文档 https developer android com guide components services html ExtendingService https developer android com guide
  • Angular 4 Subscribe方法多次调用

    我正在创建一个全局模态组件 我的问题是 当我调用 subscribe 方法时 它会根据调用的模态数量多次调用 如何防止对可观察订阅方法的多次调用 请检查下面我的代码 提前致谢 模态 model ts export class Modal t
  • 将 nvarchar 值转换为数据类型 int 时转换失败

    我创建了下面列出的过程 CREATE procedure getdata ID int frm varchar 250 to varchar 250 AS BEGIN DECLARE SQL nvarchar 500 set SQL sel
  • 如何在 Perl 中获取用户输入而不等待输入?

    我正在尝试用 Perl 制作一个交互式 shell 脚本 我能找到的唯一用户输入如下 name