从Perl调用的Perl脚本似乎没有刷新stdout

时间:2018-04-30 15:32:35

标签: perl stdout

我有两个Perl脚本 - 我们称之为script.plscript2.pl

script2.pl更新命令行,如:

print "Progress $progress percent...\r";

为了让这个工作起作用,我必须在script2.pl开始时启用autoflush:

$|++;

现在,问题出现了,因为我必须从script2.pl调用script.pl,这个 - 更新/刷新 - 只在script2.pl直接运行时才有用,而不是在它来自script.pl

我尝试过各种方式调用script2.pl,从system()到反叛,但绝不会发生更新。

当我从另一个Perl脚本调用一个Perl脚本时,我是否遗漏了有关处理stdout输出的内容?

1 个答案:

答案 0 :(得分:3)

使用反引号调用将生成一个新的perl进程,对于该进程,将设置自动刷新。这意味着无论script2.pl输出的是什么,都会在打印出来后立即出现。当然在做

my $output = `perl script2.pl`;

意味着你在输出时实际上并没有阅读它,而是要求所有输出在$output完成时结束。

运行$|的{​​{1}}进程中的perlscript2.pl无影响力。如果您希望script.pl进程具有无缓冲输出,请在此处关闭缓冲。

替代方法可能是不将script.pl作为单独的流程运行,而是将其重构为模块并正确调用,或使用script2.pldo来调用它一旦。在任何一种情况下,对require的更改都会在同一个Perl解释器中发生,因此会产生影响。

当然,如果应用程序的内部部分混淆了应用程序的输出缓冲,那么这不是一个好主意。最好的方法是在不更改该模块中的缓冲的情况下将其重构为模块,并在您使用它的程序中,将缓冲设置为您对该特定程序所需的内容 。总是让消费者决定他们想要什么,即使这只是你自己。