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

Bar*_*t B 2 perl

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

我正在炮轰:

print `$command`;
Run Code Online (Sandbox Code Playgroud)

这就是调用PHP脚本的意义上的工作,它完成了它的工作,但是,在PHP脚本完成半小时后,Perl没有输出.

有没有一种方法可以解决,以便PHP收到它后立即打印出来的输出?

Mat*_*ton 8

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

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

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

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

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