为什么调用另一个带有反引号的perl程序时会丢失输出

为什么调用另一个带有反引号的perl程序时会丢失输出,perl,output,backquote,Perl,Output,Backquote,如果我运行一个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");

如果我运行一个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。

您有路径问题

如果我将反勾号从
ProgB.pl
更改为
/ProgB.pl
,它将按预期工作(
$dum
被分配值“
从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.
因此,再次说明您应该始终检查系统调用的返回值以了解错误情况。

您有一个路径问题

如果我将反勾号从
ProgB.pl
更改为
/ProgB.pl
,它将按预期工作(
$dum
被分配值“
从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.

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

似乎由于未能在ProgB中的print命令末尾添加换行符,我在返回ProgA之前未能刷新缓冲区。多亏了Chris Turner。

在ProgB中,由于未能在打印命令末尾添加换行符,我在返回ProgA之前未能刷新缓冲区。多亏了克里斯·特纳。

你期待它以
$dum
收场是正确的——它应该;
ProgB.pl
中的
print
会转到
STDOUT
,因此它应该在
$dum
中结束。还有其他东西,没有显示。你能显示完整的程序吗,或者如果它们太大的话,至少能显示更多的程序吗?这就是backticks所做的——它们捕获其他程序打印到变量中的任何内容,所以它不会显示出来(直到你决定自己打印变量为止)。但无论如何,从Perl调用Perl似乎是一种糟糕的安排方式。你能把另一个程序变成一个模块,你可以把它加载到你的程序中吗?这些都是完整的程序,只是为了隔离问题而编写的。最初的程序有几千行。我从perl调用perl程序的原因是我试图用perl替换批处理文件。我没有将两个程序都放在一个文件中的原因是我试图将它们模块化,以便在其他组合中使用。然后被调用的程序构造、写出并执行一个带有反引号的html/js程序来显示结果?那就有点神秘了。在实际方面,您可以使用一个模块来运行另一个脚本,而不是backticks。如果
system
可以找到/运行B脚本,那么模块也会找到/运行B脚本(这是他们最常用的)。一些好的是和。
\n
传统上是在一行的末尾打印,而不是在开头。你期望它以
$dum
结尾是正确的——它应该是;
ProgB.pl
中的
print
会转到
STDOUT
,因此它应该在
$dum
中结束。还有其他东西,没有显示。你能显示完整的程序吗,或者如果它们太大的话,至少能显示更多的程序吗?这就是backticks所做的——它们捕获其他程序打印到变量中的任何内容,所以它不会显示出来(直到你决定自己打印变量为止)。但无论如何,从Perl调用Perl似乎是一种糟糕的安排方式。你能把另一个程序变成一个模块,你可以把它加载到你的程序中吗?这些都是完整的程序,只是为了隔离问题而编写的。最初的程序有几千行。我从perl调用perl程序的原因是我试图用perl替换批处理文件。我没有将两个程序都放在一个文件中的原因是我试图将它们模块化,以便在其他组合中使用。然后被调用的程序构造、写出并执行一个带有反引号的html/js程序来显示结果?那就有点神秘了。在实际方面,您可以使用一个模块来运行另一个脚本,而不是backticks。如果
system
可以找到/运行B脚本,那么模块也会找到/运行B脚本(这是他们最常用的)。一些好的是和。
\n
传统上是指打印在行尾,而不是“再次说明您应该始终检查”的开头。。。是的,汉克斯,但我根本不知道你的结果。如果我加上'die$!'它没有被执行。如果我在ProgA.pl中添加“/”,我得到的错误是“将要调用ProgB.pl”。“.”未被识别为内部或外部命令,您使用的是什么环境和perl版本?我使用Debian下的Perl5.20.2获得了这些结果。你可能在Windows中工作吗?这似乎是Linux/Windows之间的一种差异。。。是的,汉克斯,但我根本不知道你的结果。如果我加上'die$!'它没有被执行。如果我在ProgA.pl中添加“/”,我得到的错误是“将要调用ProgB.pl”。“.”未被识别为内部或外部命令,您使用的是什么环境和perl版本?我使用Debian下的Perl5.20.2获得了这些结果。你可能在Windows中工作吗?这似乎是Linux/Windows之间的一种差异。仅供参考:我无法让backticks表现得更好