运行 启用自动刷新的 perl 二进制文件

Run perl binary with autoflush enabled

我的程序 运行s perl 作为一个进程可能在很多地方都有不同的脚本,我已经继承了这些脚本,如果可以避免的话,我宁愿不要进行不必要的修改。

我面临的根本问题是我的程序无法在执行 perl 脚本时使用标准输出,除非启用自动刷新(否则它会在 perl 脚本完成后立即获取每条日志消息)。

因此,我想做的是 运行 perl 如果可能的话,通过命令行参数启用自动刷新。像这样的东西是理想的:

perl -e "$| = 1" -e "foo.pl"

但显然那是行不通的。

有一个名为 Devel::Autoflush 的 CPAN 模块就是这样做的。您将从命令行调用它:

perl -MDevel::Autoflush your-script-name-here.pl

...并设置自动刷新模式。查看源代码很容易看出它是如何工作的。如果您生活在不允许使用 CPAN 模块的世界中,您可以自己实现它。只需创建一个模块如下:

package AutoFlush;

my $orig_fh = select STDOUT;
$| = 1;
select STDERR;
$| = 1;
select $orig_fh;

1;

然后从命令行调用它,就像我上面描述的那样:

perl -MAutoFlush your-script-name-here.pl

这个小示例模块与 Devel::Autoflush 的做法几乎相同。

更新:正如 TLP 正确指出的那样,下面的语法会更简单:

package AutoFlush

STDOUT->autoflush(1);
STDERR->autoflush(1);

1;

这可能会引入更多代码,因为语法依赖于将 STDOUT 和 STDERR 文件句柄隐式按需升级为 IO::Handle 对象,但是当首先为了清晰度和程序员效率进行编码时,这是一个明显改善。