【问题标题】:Output stdin, stdout to file and console using Perl使用 Perl 将标准输入、标准输出输出到文件和控制台
【发布时间】:2015-12-11 13:01:25
【问题描述】:

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

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

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

我也找到了Duplicate stdin to stdout,但真的无法实现我想要的。 我错过了什么吗?!

有没有更清洁的解决方案?

【问题讨论】:

  • 为什么不简单地将所有内容打印两次(我知道,有点多余,但这是一种方式):一次到stdout,一次到文件?然后将输入也打印到文件中。
  • @Arc676 这是我最后的选择;)

标签: perl file-io stdin


【解决方案1】:

首先,永远不要使用短语“将标准输入重定向到...”,因为输入标准输入。它不会任何东西。它来自来自某个地方。

您似乎希望在您的日志文件中出现$var 的副本。由于您从未将$var 打印到$tee,因此不可能发生这种情况。

那么你为什么认为$var 会出现在日志文件中?从您在终端上看到的副本旁边向我们展示日志文件副本的方式,我猜您的推理是这样的:

  1. tee 将所有输出放入日志文件中
  2. tee 还将所有输出都放在终端上
  3. 我的程序除了进入 tee 的内容之外没有输出任何其他内容
  4. 屏幕内容应与日志文件匹配

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

3a。除了我的程序输出之外,没有其他任何内容写入终端

这是不正确的部分。当您在程序运行时在终端中键入 y 时,终端本身 会回显您键入的内容。它在终端窗口中打印一个副本,并将字符发送到程序的标准输入。您在屏幕上看到的y 根本不是程序输出的一部分。

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

可以要求终端停止回显,然后您负责在输入字符时打印字符,以便用户可以看到他们正在输入的内容。如果您想尝试,请参阅Term::ReadKey 模块。

或者,如果您真正想要的是在程序运行期间出现在终端上的所有内容的完整记录,也许您应该在标准 unix 工具 script 中运行它,该工具正是为此目的而制作的。

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

【讨论】:

  • 我知道IO::Tee 模块。但我不想使用任何包。
猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2017-06-09
相关资源
最近更新 更多