perl - 如何实时跨平台将 perl 代码输出到 STDOUT/STDERR 和文件?

标签 perl stdout tee

我需要将普通 Perl 代码的输出同时输出到屏幕和日志文件中。然而,问题是该工具的运行时间可能长达数小时。使用 Capture::Tiny 的 tee 意味着日志文件只会在脚本终止后写入,这不是很有用。

为了使事情更加复杂,我需要从同一进程捕获直接 perl 的输出,以及使用 system() 调用的进程的输出。

最后,由于雇主的限制,它也需要在 Win32 上工作。

我还有哪些其他选择?

最佳答案

使用PerlIO::Util .

刚刚在 Strawberry Perl 5.12.1 32 位下对其进行了测试,它运行良好,因此它将是跨平台的。下面的代码完全符合您的预期。由于它修改了实际的 STDOUT 和 STDERR 文件句柄,因此对它们的任何写入都将自动进行。

use strict;
use warnings;

use IO::Handle;
use PerlIO::Util;
use 5.012;

for (*STDOUT, *STDERR) {
  $_->autoflush; $_->push_layer(tee => ">>stdout.txt");
}

for (1..10) {
  say $_;
  warn $_ unless $_ % 2;
}

关于perl - 如何实时跨平台将 perl 代码输出到 STDOUT/STDERR 和文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5323268/

相关文章:

linux - 是否保证 tee 打印到 stdout 的顺序?

linux - 需要在来自远程 ssh 的文件末尾的特定行插入一个单词

linux - 在 Perl 脚本中使用未初始化的值

perl - 在 Perl 中 - 如果需要可以禁用短路评估吗?

linux - 在 linux fedora 中重定向系统或子进程标准输出

python - 从标准输出获取时间戳后的行

c++ - 将一个程序的输出通过管道传输到另一个程序不适用于该特定程序

linux - 如何将中间结果从管道打印到屏幕?

perl - 如何规范化 Perl 函数参数以进行记忆化?

perl - 为什么我可以通过将尖括号的结果分配给输入记录分隔符来处理文件?