当前位置: 首页 > 知识库问答 >
问题:

使用 Perl 输出标准、标准输出到文件和控制台

孙星鹏
2023-03-14

我正在尝试使用perl进行简单的问卷调查。我想在用户输入时将响应记录在日志文件中。我在将stdin重定向到文件时遇到问题。

下面是我实现的代码。参考这个。

open my $tee, "|-", "tee some_file.out";
print $tee "DO you want to continue?(y/n)\n";
$var=<STDIN>;
$var =~ s/[\n\r\f\t]//g;
if($var eq "y"){
    print $tee "Enter\n";
}
close $tee;

我现在得到的输出是,只有在用户输入后,问题才被打印出来。

#in console
y
DO you want to continue?(y/n)
Enter

#some_file.out
DO you want to continue?(y/n)
Enter

下面是预期的输出:

#in console
DO you want to continue?(y/n)
y
Enter

#some_file.out
DO you want to continue?(y/n)
y
Enter

我还发现了重复的stdin到stdout,但真的无法实现我想要的。我错过了什么吗?!

有更清洁的解决方案吗?

共有1个答案

翟京
2023-03-14

首先,切勿使用短语“将标准定向到...”因为标准输入是输入。它不去任何东西。它来自某个地方。

似乎您所期望的是在您的日志文件中显示$var的副本。由于您从未将$var打印到$tee因此不可能发生。

那么,为什么您认为< code>$var会出现在日志文件中呢?从您向我们展示日志文件副本以及您在终端上看到的副本的方式来看,我猜想您的推理是这样的:

    < li > The将所有输出放入日志文件中 < li > The还将所有输出放在终端上 < li >除了进入球座的内容之外,我的程序没有输出任何其他内容 < li >画面内容应该与日志文件相匹配

但是有一个隐藏的假设需要得出结论:

3a。除了我的程序输出之外,没有其他东西被写入终端

这是不正确的部分。当您在程序运行时在终端中键入< kbd>y时,终端本身会回显您键入的内容。它在终端窗口中打印一份拷贝,并且把字符发送到程序的stdin。您在屏幕上看到的< code>y根本不是程序输出的一部分。

由于回显是由终端而不是程序完成的,因此您无法指示它也将副本发送到日志文件。如果要记录它,则需要在此处显式打印它。

您可以要求终端停止回显,然后您负责在输入字符时打印字符,这样用户就可以看到他们在输入什么。如果您想尝试一下,请参阅< code>Term::ReadKey模块。

或者,如果您真正想要的是在程序运行期间终端上出现的所有内容的完整记录,那么您可能应该在标准的unix工具script中运行它,这正是为了这个目的。

(旁注:你知道IO::Tee模块吗?你可以在没有外部进程的情况下获得teed输出)

 类似资料:
  • 我是Java的初学者。学习罗伯特·塞奇威克的《Java导论》 我尝试在Netbeans中编译以下代码。 } 我收到了这个错误。我已将文件放置在标准位置。java 线程“main”java.lang.RuntimeException中的异常:无法编译的源代码-错误的sym类型:示例。StdIn.is在示例中为空。verage.main(verage.java:16)Java结果:1 BUILD SU

  • 和之前 inputs/stdin 插件一样,outputs/stdout 插件也是最基础和简单的输出插件。同样在这里简单介绍一下,作为输出插件的一个共性了解。 配置示例 output { stdout { codec => rubydebug workers => 2 } } 解释 输出插件统一具有一个参数是 workers。Logstash 为输

  • 问题内容: 在bash中,调用将在stdout上显示该命令的任何输出。 调用会将该命令的任何输出重定向到指定的文件(在本例中为“输出”)。 有没有一种方法可以将输出重定向到文件 并 在stdout上显示? 问题答案: 您想要的命令名为 : 例如,如果您只关心标准输出: 如果要包括stderr,请执行以下操作: 将通道2(stderr /标准错误)重定向到通道1(stdout /标准输出),以便将两

  • 回顾一下我们写的第一个 Rust 程序就是带副作用的,其副作用就是向标准输出(stdout),通常是终端或屏幕,输出了 Hello, World! 让屏幕上这几个字符的地方点亮起来。println! 宏是最常见的输出,用宏来做输出的还有 print!,两者都是向标准输出(stdout)输出,两者的区别也一眼就能看出。至于格式化输出,基础运算符和字符串格式化小节有详细说明,这里就不再啰嗦了。 更通用

  • 问题内容: 我有一个奇怪的问题,如果可以解决,那就太好了。出于调试目的(以及其他一些目的),我在标准输出上编写了控制台Java应用程序的日志。在标准输出上写一些内容,在标准错误上打印一些错误,例如错误。问题是这两个没有完全同步,因此打印线的顺序并不总是正确的。我猜这是因为打印了很多东西,并且碰巧一个输出的缓冲区已满,所以其他输出在第一个输出刷新其缓冲区之前就已打印出来。 例如,我想这样写: 有时打

  • 我最近想出了如何在汇编中写入 stdout,但现在无法从 stdin 中读取,并将我读取的内容输出回 stdout。这是我到目前为止的代码: 我很确定我看错了。我很确定和的行为没有达到预期(如果我将 替换为 次),这是导致我的问题的原因(当我输入输入并点击return时,它什么也不显示)。 我已经摸索了一段时间了,希望能得到任何帮助。(我这么做只是为了了解这不是家庭作业)。 我的问题本质上是我做错