我的程序运行perl
作为一个进程,可能在许多地方使用我继承的不同脚本,如果我可以避免它,则不希望不必修改。
我面临的根本问题是我的程序无法使用标准输出,因为perl脚本正在执行,除非启用了autoflush(否则它将在perl脚本完成后立即获取每条日志消息)。
因此,我想做的是如果可能的话,使用命令行参数启用autoflush运行perl
。这样的事情是理想的:
perl -e "$| = 1" -e "foo.pl"
但显然这不起作用。
答案 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对象的隐式按需升级,但是在编写清晰度和程序员效率时,这是一个明显的改进。