perl - 在启用自动刷新的情况下运行 perl 二进制文件

标签 perl process

我的程序将 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/

相关文章:

android - registerOnSharedPreferenceChangeListener 不适用于在不同进程中所做的更改

Python - 如何利用多个 CPU 核心

c# - 如何确定从 C# 运行的 python 脚本已通过或失败

arrays - Perl:如何正确初始化散列或数组

perl - 如何在 Perl 语句中获取输入文件的名称?

arrays - 从N个数组中获取所有组合

linux - 对于 SystemTap 脚本,如何确保捕获进程正在结束的事实?

perl - 如何让 DBI 记录所有查询,包括参数?

arrays - 在 Perl 中以编程方式更改排序顺序

c - 使用 waitpid 在后台运行进程?