【问题标题】:Run perl binary with autoflush enabled在启用自动刷新的情况下运行 perl 二进制文件
【发布时间】:2015-03-05 06:14:43
【问题描述】:

我的程序在许多地方运行perl 作为一个进程,我继承了不同的脚本,如果可以避免的话,我不想进行不必要的修改。

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

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

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

但显然这行不通。

【问题讨论】:

标签: perl process


【解决方案1】:

有一个名为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 对象,但是当首先为了清晰和程序员效率进行编码时,这是一个明显的改进。

【讨论】:

  • 更简单的语法是STDOUT->autoflush(1); STDERR->autoflush(1);
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 2020-12-23
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2017-07-29
  • 2022-06-28
相关资源
最近更新 更多