使用Perl输出stdin,stdout到文件和控制台

时间:2015-12-11 13:01:25

标签: perl file-io stdin

我正在尝试使用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,但实际上无法实现我想要的目标。 我错过了什么吗?!

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

1 个答案:

答案 0 :(得分:2)

首先,永远不要使用短语&#34;将标准输入重定向到...&#34;因为stdin是输入。它没有任何东西。它来自某处的

您的预期似乎是在您的日志文件中显示$var的副本。由于您从未将$var打印到$tee,因此无法实现。

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

  1. tee将所有输出放入日志文件
  2. T恤也将所有输出都放在终端上
  3. 除了进入发球台之外,我的节目没有输出任何其他内容
  4. 屏幕内容应与日志文件
  5. 匹配

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

    3A。除了程序的输出

    之外,没有其他内容写入终端

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

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

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

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

    (旁注:您是否了解IO::Tee模块?您可以在没有外部流程的情况下获得输出)