我正在尝试使用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,但实际上无法实现我想要的目标。 我错过了什么吗?!
有没有更清洁的解决方案?
答案 0 :(得分:2)
首先,永远不要使用短语&#34;将标准输入重定向到...&#34;因为stdin是输入。它没有到任何东西。它来自某处的 。
您的预期似乎是在您的日志文件中显示$var
的副本。由于您从未将$var
打印到$tee
,因此无法实现。
那么为什么你认为$var
会出现在日志文件中?从你向我们展示了你在终端上看到的副本旁边的日志文件副本的方式来看,我猜你的推理是这样的:
但是有一个隐藏的假设是得出结论所需要的:
3A。除了程序的输出
之外,没有其他内容写入终端那是不正确的部分。当您在程序运行时在终端中键入 y 时,终端本身会回显您键入的内容。它在终端窗口中打印一份副本,并将该字符发送到您程序的标准输入。您在屏幕上看到的y
根本不属于您的计划输出。
由于回显是由终端而不是程序完成的,因此您无法指示它也将副本发送到您的日志文件。如果要记录它,则需要在那里明确打印。
您可以要求终端停止回显,然后您负责在键入字符时打印字符,以便用户可以看到他们正在键入的内容。如果您想尝试,请参阅Term::ReadKey
模块。
或者,如果你真正想要的是在程序运行期间终端上出现的所有内容的完整记录,也许你应该在标准的unix工具script
中运行它,这是为了这个目的而制作的
(旁注:您是否了解IO::Tee
模块?您可以在没有外部流程的情况下获得输出)