我的程序将 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 对象,但是当首先为了清晰度和程序员效率而编码时,这是一个明显的改进。
关于perl - 在启用自动刷新的情况下运行 perl 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28871215/