【问题标题】:Print STDOUT to both file and STDOUT with perl使用 perl 将 STDOUT 打印到文件和 STDOUT
【发布时间】:2015-09-25 11:58:02
【问题描述】:

在其中一篇文章中,建议使用以下方法将 STDOUT 捕获到文件中,而不会影响 STDOUT(终端)的日志记录。

open my $tee, "|-", "tee E:/log.txt";

对于如下序列:

print $tee "Log1\n";
print $tee "Log2\n";
my $input = <STDIN>;
print $tee "Log3\n";

除非我提供输入,否则我在终端上看不到任何消息。一旦我输入任何字符并按回车键,我就会看到日志显示为

Log1
Log2
Log3

有没有办法让我获得前两个输出,然后等待输入,然后等待第三个输出?

或者有什么方法可以将 STDOUT 日志捕获到文件中,而 STDOUT 日志也不断出现在终端上?

【问题讨论】:

    标签: stdout stdin


    【解决方案1】:

    使用

    将您的文件句柄设置为无缓冲输出
    $old_fh = select($tee);
    $| = 1;
    select($old_fh);
    

    【讨论】:

    • 或者:使用IO::Handle; $tee->autoflush(1);
    • 谢谢,这符合我的预期。你能解释一下,这是做什么的? '$|=1' 是什么意思?
    • 这是一个深入 Unix C 库的特性,Perl 也使用它。为了优化资源使用,它不会立即写入输出,而是等待缓冲区已满或控制台输入。 $|特殊变量可用于在 Perl 中关闭此行为。另请参阅:perldoc.perl.org/perlvar.html#Variables-related-to-filehandles.
    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2019-10-28
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2011-04-13
    相关资源
    最近更新 更多