运行 启用自动刷新的 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 对象,但是当首先为了清晰度和程序员效率进行编码时,这是一个明显改善。
我的程序 运行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 对象,但是当首先为了清晰度和程序员效率进行编码时,这是一个明显改善。