我有两个Perl脚本 - 我们称之为script.pl
和script2.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输出的内容?
答案 0 :(得分:3)
使用反引号调用将生成一个新的perl
进程,对于该进程,将设置自动刷新。这意味着无论script2.pl
输出的是什么,都会在打印出来后立即出现。当然在做
my $output = `perl script2.pl`;
意味着你在输出时实际上并没有阅读它,而是要求所有输出在$output
完成时结束。
运行$|
的{{1}}进程中的perl
在script2.pl
上无影响力。如果您希望script.pl
进程具有无缓冲输出,请在此处关闭缓冲。
替代方法可能是不将script.pl
作为单独的流程运行,而是将其重构为模块并正确调用,或使用script2.pl
或do
来调用它一旦。在任何一种情况下,对require
的更改都会在同一个Perl解释器中发生,因此会产生影响。
当然,如果应用程序的内部部分混淆了应用程序的输出缓冲,那么这不是一个好主意。最好的方法是在不更改该模块中的缓冲的情况下将其重构为模块,并在您使用它的程序中,将缓冲设置为您对该特定程序所需的内容 。总是让消费者决定他们想要什么,即使这只是你自己。