【发布时间】: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::Tiny 和IPC::Run3。 -
\n传统上意味着打印在行尾,而不是开头