加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在不等待输入Perl的情况下获得用户输入?

发布时间:2020-12-15 21:12:43 所属栏目:大数据 来源:网络整理
导读:我试图在Perl中制作一个交互式的 shell脚本. 我可以找到的唯一用户输入如下: $name = STDIN; print STDOUT "Hello $namen"; 但是在这种情况下,用户必须始终按Enter键使更改生效. 按下按钮后,如何让程序立即执行? 解决方法 从 perlfaq8的答案到 How do I r
我试图在Perl中制作一个交互式的 shell脚本.

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

$name = <STDIN>;
 print STDOUT "Hello $namen";

但是在这种情况下,用户必须始终按Enter键使更改生效.
按下按钮后,如何让程序立即执行?

解决方法

从 perlfaq8的答案到 How do I read just one key without waiting for a return key?

控制输入??缓冲是与系统有关的重要事项.在许多系统上,您可以使用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模块提供了一个易于使用的界面,应该比每个键的炮弹效率更高.它甚至包括对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,1);
    cooked();
    return $key;
}

END { cooked() }

1;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读