在Perl中运行外部程序而没有同时输出

时间:2019-06-13 05:26:38

标签: perl pipe ipc

我有一个Perl脚本

for my $i (1..10) {
    print "How $i\n";
    sleep(1);
}

我想从另一个perl脚本运行它并捕获其输出。我知道我可以使用qx()或反引号,但是当程序退出时它们将同时返回所有输出。

但是,我要的是在第二个脚本可用时立即打印第二个脚本的第一个脚本的输出。对于示例代码,第一个脚本的输出是从第二个脚本分十步而不是一次打印的。

我看着this question并将第二个脚本写为

my $cmd = "perl a.pl";
open my $cmd_fh, "$cmd |";

while(<$cmd_fh>) {
    print "Received: $_\n";
    STDOUT->flush();
}

close $cmd_fh;

但是,输出仍在同时打印。我想知道一种完成此任务的方法吗?

1 个答案:

答案 0 :(得分:3)

子级以4或KiB或8 KiB的块发送输出,而不是一次发送一行。与大多数程序一样,Perl程序会在换行时刷新STDOUT,但仅当连接到终端时才可以。他们完全缓冲输出,否则。您可以向子级添加$| = 1;来禁用STDOUT的缓冲。

如果您不能修改子代,则可以使用伪ttys而不是管道来欺骗此类程序。参见IPC::Run。 (在其文档中搜索“ pty”。)