如何在Windows上使用Perl从STDIN中读取单个字符?

使用Perl,如何从STDIN捕获单个字符而不需要用户点击回车(类似于C的getch()函数)?

Perl有一个getc()函数,但根据perlfunc :

然而,它不能等待用户input,它本身不能用来获取单个字符。

perlfunc文档提供了使用getc()读取单个字符的方法,但是它需要使用stty操作terminal设置。 我正在写的脚本需要在Windows上工作(没有cygwin,msys等) – 所以这不是一个选项。

你想要这个模块: Term :: ReadKey 。

从perlfaq5的答案我怎样才能从文件中读取单个字符? 从键盘?


对于大多数文件句柄,你可以使用内建的getc()函数,但是它不会(很容易)在终端设备上工作。 对于STDIN,可以使用CPAN中的Term :: ReadKey模块,或者在perlfunc中使用getc中的示例代码。

如果您的系统支持便携式操作系统编程接口(POSIX),那么您可以使用以下代码,并注意关闭回显处理。

 #!/usr/bin/perl -w use strict; $| = 1; for (1..4) { my $got; print "gimme: "; $got = getone(); print "--> $got\n"; } exit; BEGIN { 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); $term->setcc(VTIME, 1); $term->setattr($fd_stdin, TCSANOW); } sub cooked { $term->setlflag($oterm); $term->setcc(VTIME, 0); $term->setattr($fd_stdin, TCSANOW); } sub getone { my $key = ''; cbreak(); sysread(STDIN, $key, 1); cooked(); return $key; } } END { cooked() } 

来自CPAN的Term :: ReadKey模块可能更易于使用。 最近的版本也包括对非便携式系统的支持。

 use Term::ReadKey; open(TTY, "</dev/tty"); print "Gimme a char: "; ReadMode "raw"; $key = ReadKey 0, *TTY; ReadMode "normal"; printf "\nYou said %s, char number %03d\n", $key, ord $key;