【问题标题】:Perl script called from Perl doesn't seem to flush stdout从 Perl 调用的 Perl 脚本似乎没有刷新标准输出
【发布时间】:2018-10-10 17:41:54
【问题描述】:

我有两个 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 脚本被另一个脚本调用时,我是否遗漏了一些关于处理标准输出的内容?

【问题讨论】:

  • 如何从script.pl 中调用script2.pl
  • 目前我只是在反引号中使用`script2.pl`

标签: perl stdout


【解决方案1】:

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

my $output = `perl script2.pl`;

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

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


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

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

【讨论】:

  • 可能是我误解了你的问题。在这种情况下,请澄清。
  • 不,我想你抓住了我。我很欣赏澄清。我想既然我已经用$|++ 关闭了两者的缓冲,并且因为它们是在同一个控制台中执行的,我会看到它——但我想从技术上讲它们不是相同的标准输出是有道理的。感谢您的回答。
  • @KT_ 如果你在两个脚本中都打开了它,它应该可以工作。但是,如果您从script.plscript2.pl 掏空,script2.pl 是否有$|++ 并不重要。
  • @KT_:使用反引号运行程序会将输出而不是打印到屏幕上。您可以在运行完成后打印结果,但您会立即获得整个结果。
猜你喜欢
  • 1970-01-01
  • 2019-12-21
  • 2018-07-20
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多