我有一个Perl脚本,它必须包装一个产生大量输出的PHP脚本,并且需要大约半小时才能运行。
我正在炮轰:
print `$command`;
这在调用PHP脚本的意义上是有效的,并且它确实起作用,但是,在PHP脚本完成半小时之后,Perl不会呈现任何输出。
有没有一种方法可以解决这个问题,一旦收到它,就会通过perl打印PHP的输出?
答案 0 :(得分:8)
问题是Perl在PHP脚本终止之前不会完成阅读,只有当它完成阅读才会写入。反引号操作符阻塞,直到子进程退出,并且隐式地进行读/写循环没有魔力。
所以你需要写一个。尝试使用管道打开:
open my $fh, '-|', $command or die 'Unable to open';
while (<$fh>) {
print;
}
close $fh;
这应该在PHP脚本写入时读取每一行,并立即输出。如果PHP脚本没有以方便的行输出并且您想要使用单个字符进行输出,则需要使用read
来从文件句柄中获取数据,并禁用输出缓冲({{1在stdout上编写它。
答案 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。