Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Windows上使用Perl从STDIN读取单个字符?_Windows_Perl - Fatal编程技术网

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

如何在Windows上使用Perl从STDIN读取单个字符?,windows,perl,Windows,Perl,使用Perl,如何从STDIN捕获单个字符而不需要用户点击enter键(类似于C的getch()函数) Perl有一个getc()函数,但根据: 但是,它本身不能用于获取 单个字符,无需等待 用户点击回车键 perlfunc docs确实提供了一种使用getc()读取单个字符的方法,但它需要使用stty操作终端设置。我正在编写的脚本需要在Windows上运行(没有cygwin、msys等)-因此这不是一个选项。您想要此模块:。From的答案 大多数文件句柄都可以使用内置的getc()函数,但在

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

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

但是,它本身不能用于获取 单个字符,无需等待 用户点击回车键

perlfunc docs确实提供了一种使用
getc()
读取单个字符的方法,但它需要使用
stty
操作终端设置。我正在编写的脚本需要在Windows上运行(没有cygwin、msys等)-因此这不是一个选项。

您想要此模块:。

From的答案


大多数文件句柄都可以使用内置的getc()函数,但在终端设备上无法(轻松)工作。对于STDIN,可以使用CPAN中的模块,也可以使用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;
使用Term::ReadKey;

打开(TTY),“它已经在windows上移植了吗?谢谢!我已经在使用Term::Readkey来禁用回显(用于密码输入)。这很好。@Brain:Term::ReadKey可以通过activePerl获得吗?@gameover:
ppm搜索Term::ReadKey
表明可以。请记住,activePerl是Perl的一个发行版,可以在多个平台上运行。如果您关心某个特定的平台,请询问该平台。:)