【问题标题】:Read single characters, and use Return as EOL instead of Ctrl-D in Linux读取单个字符,并在 Linux 中使用 Return 作为 EOL 而不是 Ctrl-D
【发布时间】:2013-08-26 16:54:58
【问题描述】:

我是 perl 的初学者,刚开始在我的脚本中阅读用户输入。

chomp(my $inp = <> );

我习惯于使用 Return 键作为其他语言用户输入的终止符,并且不确定如何在按下单个键或某些字符后跟 Return 键后停止读取用户输入。在 unix 上运行的 perl 中,通过菱形运算符捕获输入,似乎需要按 Ctrl-D 才能结束输入。

我的问题是我想构建一个交互式菜单,其中向用户显示一个列表并要求按“A”、“B”或“C”。一旦他按下这些键中的任何一个,我想根据条件循环,而不是等待他按下 Ctrl D。如何在 perl 中获得这种级别的交互式用户输入?在 C 语言中,我会使用 getch。在 Bash 中,我会使用 read$REPLY

我也想知道如何使用 Return 键来终止用户输入。

获取单个字符,perldoc mentions:

if ($BSD_STYLE) {
        system "stty cbreak </dev/tty >/dev/tty 2>&1";
    }
    else {
        system "stty", '-icanon', 'eol', "\001";
    }
    $key = getc(STDIN);
    if ($BSD_STYLE) {
        system "stty -cbreak </dev/tty >/dev/tty 2>&1";
    }
    else {
        system 'stty', 'icanon', 'eol', '^@'; # ASCII NUL
    }
    print "\n";

肯定是像 perl 这样的语言,that 难不难?

编辑:似乎我正在寻找的东西不是本机可用的。但是,IO::Prompter 似乎是解决方案。

【问题讨论】:

    标签: perl input


    【解决方案1】:

    菱形运算符在标量上下文中读取一行,在数组上下文中读取一个文件。 Ctrl-D 是 EOF,Return 是 EOL。

    因为chomp 提供了一个列表上下文,所以你必须把它分解:

    my $inp = <>;
    chomp $inp;
    

    读取单个按键的便携方式是Term::Readkey。见http://learn.perl.org/faq/perlfaq5.html#How-can-I-read-a-single-character-from-a-file-From-the-keyboard-

    【讨论】:

    • 因为chomp 提供列表上下文 – 不。该赋值提供了标量上下文,因此chomp( my $inp = &lt;&gt; ) 工作正常并且只读取一行——它甚至是一个常见的习惯用法!
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    相关资源
    最近更新 更多