gpt4 book ai didi

从 Perl 调用的 Perl 脚本似乎没有刷新标准输出

转载 作者:行者123 更新时间:2023-12-01 23:37:59 25 4
gpt4 key购买 nike

我有两个 Perl 脚本——我们称它们为 script.plscript2.pl

script2.pl 更新命令行,如:

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

为了让它工作,我必须在 script2.pl 开始时打开自动刷新:

$|++;

现在,问题出现了,因为我必须从 script.pl 调用 script2.pl,而这个——更新/刷新——似乎只有在 script2.pl 直接运行,而不是从 script.pl 调用时。

我已经尝试了各种调用 script2.pl 的方法,从 system() 到反引号,但在任何情况下都不会发生更新。

当一个 Perl 脚本被另一个脚本调用时,我是否遗漏了一些关于处理 stdout 输出的信息?

最佳答案

使用反引号调用将产生一个新的 perl 进程,并且为该进程设置自动刷新。这意味着 script2.pl 的任何输出都会在打印后立即输出。当然在做

my $output = `perl script2.pl`;

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

运行script2.plperl进程中的$|没有影响脚本.pl。如果您希望您的 script.pl 进程具有无缓冲输出,请关闭那里的缓冲。


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

当然,如果应用程序的内部部分干扰了应用程序的输出缓冲,那可不是什么好主意。最好的方法是将其重构为一个模块,而不更改该模块中的缓冲,并在您使用它的程序中,将缓冲设置为您需要的特定程序 .始终让消费者决定他们想要什么,即使那只是您自己。

关于从 Perl 调用的 Perl 脚本似乎没有刷新标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50103707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com