在启用autoflush的情况下运行perl二进制文件

时间:2015-03-05 06:14:44

标签: perl process

我的程序运行perl作为一个进程,可能在许多地方使用我继承的不同脚本,如果我可以避免它,则不希望不必修改。

我面临的根本问题是我的程序无法使用标准输出,因为perl脚本正在执行,除非启用了autoflush(否则它将在perl脚本完成后立即获取每条日志消息)。

因此,我想做的是如果可能的话,使用命令行参数启用autoflush运行perl。这样的事情是理想的:

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

但显然这不起作用。

1 个答案:

答案 0 :(得分:3)

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

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

...并设置autoflush模式。查看源代码,很容易看出它是如何工作的。如果您居住在不允许使用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对象的隐式按需升级,但是在编写清晰度和程序员效率时,这是一个明显的改进。