运行 没有同时输出的 Perl 外部程序
Running external program in Perl without simultaneous output
我有一个 Perl 脚本
for my $i (1..10) {
print "How $i\n";
sleep(1);
}
我想从另一个 perl 脚本 运行 它并捕获它的输出。我知道我可以使用 qx() 或反引号,但它们会在程序退出时同时 return 所有输出。
但是,我想要的是在第二个脚本可用时立即打印第一个脚本的输出,即。对于示例代码,第一个脚本的输出是从第二个脚本开始分十步打印的,而不是一次性打印的。
我查看了 this question 并将我的第二个脚本编写为
my $cmd = "perl a.pl";
open my $cmd_fh, "$cmd |";
while(<$cmd_fh>) {
print "Received: $_\n";
STDOUT->flush();
}
close $cmd_fh;
但是,输出仍在同时打印。我想知道完成这项工作的方法?
child 以 4 或 KiB 或 8 KiB 的块而不是一次一行的形式发送输出。 Perl 程序,像大多数程序一样,在换行时刷新 STDOUT,但只有在连接到终端时才会刷新;否则他们会完全缓冲输出。您可以将 $| = 1;
添加到 child 以禁用 STDOUT 的缓冲。
如果您不能修改 child,可以使用 pseudo-ttys 而不是管道来欺骗此类程序。参见 IPC::Run。 (在其文档中搜索 "pty"。)
我有一个 Perl 脚本
for my $i (1..10) {
print "How $i\n";
sleep(1);
}
我想从另一个 perl 脚本 运行 它并捕获它的输出。我知道我可以使用 qx() 或反引号,但它们会在程序退出时同时 return 所有输出。
但是,我想要的是在第二个脚本可用时立即打印第一个脚本的输出,即。对于示例代码,第一个脚本的输出是从第二个脚本开始分十步打印的,而不是一次性打印的。
我查看了 this question 并将我的第二个脚本编写为
my $cmd = "perl a.pl";
open my $cmd_fh, "$cmd |";
while(<$cmd_fh>) {
print "Received: $_\n";
STDOUT->flush();
}
close $cmd_fh;
但是,输出仍在同时打印。我想知道完成这项工作的方法?
child 以 4 或 KiB 或 8 KiB 的块而不是一次一行的形式发送输出。 Perl 程序,像大多数程序一样,在换行时刷新 STDOUT,但只有在连接到终端时才会刷新;否则他们会完全缓冲输出。您可以将 $| = 1;
添加到 child 以禁用 STDOUT 的缓冲。
如果您不能修改 child,可以使用 pseudo-ttys 而不是管道来欺骗此类程序。参见 IPC::Run。 (在其文档中搜索 "pty"。)