Perl - 从外部进程直接输出到stdout(避免缓冲)

时间:2012-07-12 16:13:07

标签: perl

我有一个Perl脚本,它必须包装一个产生大量输出的PHP脚本,并且需要大约半小时才能运行。

我正在炮轰:

print `$command`;

这在调用PHP脚本的意义上是有效的,并且它确实起作用,但是,在PHP脚本完成半小时之后,Perl不会呈现任何输出。

有没有一种方法可以解决这个问题,一旦收到它,就会通过perl打印PHP的输出?

3 个答案:

答案 0 :(得分:8)

问题是Perl在PHP脚本终止之前不会完成阅读,只有当它完成阅读才会写入。反引号操作符阻塞,直到子进程退出,并且隐式地进行读/写循环没有魔力。

所以你需要写一个。尝试使用管道打开:

open my $fh, '-|', $command or die 'Unable to open';
while (<$fh>) {
    print;
}
close $fh;

这应该在PHP脚本写入时读取每一行,并立即输出。如果PHP脚本没有以方便的行输出并且您想要使用单个字符进行输出,则需要使用read来从文件句柄中获取数据,并禁用输出缓冲({{1在stdout上编写它。

另见http://perldoc.perl.org/perlipc.html#Using-open()-for-IPC

答案 1 :(得分:2)

你真的在做print `$command`吗?

如果您只运行命令而不捕获任何输出,只需使用system $command即可。它将直接写入stdout而不通过Perl。

答案 2 :(得分:0)

您可能想要调查Capture::Tiny。 IIRC这样的事情应该有效:

use strict;
use warnings;

use Capture::Tiny qw/tee/;

my ($stdout, $stderr, @result) = tee { system $command };

实际上,只使用system可能就足够了,YMMV。