【问题标题】:Perl - How to output all on one linePerl - 如何在一行上输出所有内容
【发布时间】:2014-04-16 12:07:36
【问题描述】:

我是 PERL 的新手,但在使用 C 语言时很快就学会了。

我的问题似乎很简单,但我一生都找不到简单的答案。基本上我想在用户输入的同一行打印一些东西

示例

print "Please Enter Here: ";
my $input = <STDIN>;
chomp $input;
print " - You Entered: $input";

输出

请在此处输入:123
- 你输入:123

这是不受欢迎的,因为我希望所有这些都在终端窗口的一行中。目前,一旦用户按下回车键,它就会在下面的行中打印第二个字符串。我想我需要做的是使用 STDIN 做一些事情,比如忽略回车或换行,但我不确定。

期望的输出

请在此处输入:123 - 您输入:123

我不知道为什么这对谷歌来说似乎是一件复杂的事情,但我还没有理解它,所以任何帮助将不胜感激。

【问题讨论】:

  • STDIN 是基于行的。可能您需要其他功能来执行此操作。例如:stackoverflow.com/questions/8676026/…
  • 为什么不在输入后重绘界面呢?否则,您将需要找到某种方法让您的终端忽略除换行符以外的所有字符,这势必会让人感到痛苦。
  • 当用户按下回车键时,肯定有一种简单的方法可以忽略返回行。以同样的方式 chomp 从变量的末尾删除 \n ,有没有办法对 STDIN 做同样的事情,这样它就不会换行?
  • 嗯,我可能在这里把我当作白痴,但我一直认为换行符来自用户实际输入的输入?如果这是真的,您至少需要您的用户以其他方式结束输入,或者让终端在将换行符传递给应用程序之前不绘制换行符。虽然可能很愚蠢,我真的从来没有想过这个。

标签: perl


【解决方案1】:

嗯,这很有趣……

首先,您必须使用IO::Stty 之类的方式关闭终端回显。一旦你这样做了,你可以使用getc。请注意getc perldoc 页面有一个可以使用的示例程序。你可以循环直到你得到一个\n 字符作为输入。

你也可以试试Term::ReadKey

我自己从来没有这样做过。我一定要试一试,如果我成功了,我会发布答案。


程序

最后我已经安装了Term::ReadKey

#! /usr/bin/env perl
#
use warnings;
use strict;
use feature qw(say);

use Term::ReadKey;

ReadMode 5;  # Super Raw mode

my $string;

print "Please Enter Here: ";
while ( my $char = getc ) {
    last if ord( $char ) < 32;  # \r? \n? \l?
    $string .= $char;
    print "$char";
}

ReadMode 0;
say qq( - You entered "$string".);

我意识到,根据终端的设置方式,很难确切知道按下&lt;RETURN&gt; 时返回的内容。因此,我开始查找空格前的任何 ASCII 字符。


还有一件事:如果用户按退格键或其他特殊字符,我没有处理会发生什么。相反,我只是简单地平底船,这可能不是您想要做的。

【讨论】:

    【解决方案2】:

    最后我做到了:

    "\033[1A\033[45C
    

    它使用代码函数进行对齐和 45 缩进,并且可以正常工作。不过感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多