2

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

目前我正在炮轰:

print `$command`;

这在调用 PHP 脚本的意义上是有效的,并且它完成了它的工作,但是,直到 PHP 脚本在半小时后完成,Perl 才会呈现输出。

有没有一种方法可以让 perl 在收到 PHP 的输出后立即打印它?

4

3 回答 3

8

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

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

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

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

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

于 2012-07-12T16:17:05.840 回答
2

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

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

于 2012-07-12T22:00:17.880 回答
0

您可能想要调查Capture::Tiny. IIRC 像这样的东西应该可以工作:

use strict;
use warnings;

use Capture::Tiny qw/tee/;

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

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

于 2012-07-12T16:22:05.113 回答