【问题标题】:Why do I lose output when calling another perl program with backquotes为什么我在调用另一个带反引号的 perl 程序时会丢失输出
【发布时间】:2018-01-18 06:29:46
【问题描述】:

如果我运行一个 perl 程序并使用反引号调用另一个 perl 程序,则来自被调用程序的打印语句不会出现在终端上。

如果我使用“系统”调用程序,则会显示打印语句。

例如: 这是 ProgA.pl

print "In ProgA.pl, about to call ProgB.pl";
my $dum=`ProgB.pl`;                       # print output doesn't appear
### $dum=system("ProgB.pl");              # this prints OK
print"\nBack in ProgA.pl";
print "\ndum = $dum";             # ProgB's output doesn't show here either

(没有警告或错误,通过文件关联找到perl.exe)

这是 ProgB.pl:

print "\nPrinting from ProgB.pl";

造成差异的原因是什么?

为什么 $dum 中没有返回反引号调用输出(我尝试了 STDOUT 和 STDERR)?如果我在反引号中调用 dir,我会在 $dum 中得到它的输出。

【问题讨论】:

  • 你期望它在$dum 结束是正确的——它应该; print 中的 ProgB.pl 转到 STDOUT,所以它应该以 $dum 结束。还有一些东西,没有显示。您能否展示完整的程序,或者如果它们太大,至少可以展示更多?
  • 这就是反引号的作用——它们捕获其他程序打印到变量中的任何内容,因此不会显示(直到您决定自己打印变量)。但无论如何,从 Perl 调用 Perl 似乎是一种糟糕的安排方式。你能把另一个程序变成一个你可以加载到你的程序中的模块吗?
  • 这些是整个程序,只是为了隔离问题而编写的。原始程序有几千行。我从 perl 调用 perl 程序的原因是我试图用 perl 替换批处理文件。我没有将这两个程序放在一个文件中的原因是我试图将它们模块化以用于其他组合。然后被调用的程序构造、写出并执行带反引号的 html/js 程序以显示结果。
  • 感谢您的澄清——整个程序,嗯?那就有点神秘了。在实际方面,您可以使用模块来运行其他脚本,而不是反引号。如果system 可以找到/运行 B 脚本,那么模块也会(这是他们最常使用的)。一些不错的是Capture::TinyIPC::Run3
  • \n 传统上意味着打印在行尾,而不是开头

标签: perl output backquote


【解决方案1】:

您遇到了路径问题。

如果我将反引号从 ProgB.pl 更改为 ./ProgB.pl,它会按预期工作($dum 被赋值为“Printing from ProgB.pl”)。如果没有明确的./ 路径,它会搜索系统路径并生成错误,您可以查看是否将该行更改为

my $dum=`ProgB.pl` or die $!;

生成输出

In ProgA.pl, about to call ProgB.plNo such file or directory at ./ProgA.pl line 4.

因此再次说明您应该始终检查系统调用的返回值是否存在错误情况。

【讨论】:

  • "再次说明您应该经常检查" ...是的
  • 谢谢,但我根本没有得到你的结果。如果我添加'die $!'它没有被执行。如果我添加“./”,我会收到错误“在 ProgA.pl,即将调用 ProgB.pl”。未被识别为内部或外部命令,
  • 您使用的是什么环境和 perl 版本?我在 Debian 下使用 Perl 5.20.2 得到了这些结果。您可能在 Windows 中工作吗?这似乎是 Linux/Windows 的区别。
【解决方案2】:

看来,由于未能在 ProgB 中的打印命令末尾放置换行符,我未能在返回 ProgA 之前刷新缓冲区。感谢克里斯·特纳。

【讨论】:

  • 仅供参考:无论我尝试什么,我都无法让反引号以这种方式表现。我怀疑这背后还有更多,仍然建议切换到一个模块。
  • 是的。像 zdim 一样,我尝试移动换行符,并且行为也保持一致。
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多