我可以从另一个perl脚本中间使用系统调用从perl脚本获取值吗?



我想修改一个别人写的脚本,我想把我的脚本和他的分开。

我编写的脚本以print行结束,该行输出以空格分隔的所有相关数据。

Ex: print "$sap $stuff $more_stuff";

我想在另一个perl脚本中使用这些数据,我不确定是否可以使用系统调用我编写的脚本。

Ex: system("./sap_calc.pl $id"); #obtain printed data from sap_calc.pl here

这能做到吗?如果不是,我该怎么做呢?


有点相关,但不使用system():

如何让一个Perl脚本看到另一个Perl脚本中的变量?

如何从一个Perl脚本传递参数到另一个?

您正在寻找"反勾运算符"。

请看perlop,"类引用运算符"部分

通常,捕获程序的输出是这样的:

my $output = `/bin/cmd ...`;

注意,反划操作符只捕获STDOUT 。因此,为了捕获所有内容(也是STDERR),命令需要附加通常的shell重定向"2>&1"。

如果要使用从其他脚本打印到标准输出的数据,则需要使用反引号或qx()

system将只返回shell命令的返回值,而不是实际输出。

虽然正确的方法是将实际的代码导入到您的其他脚本中,通过构建一个模块,或者简单地使用do

作为一般规则,最好使用所有perl解决方案,而不是依赖system/shell作为"简化"的方法。

myfile.pl:

sub foo {
    print "Foo";
}
1;

main.pl:

do 'myfile.pl';
foo();

perldoc perlipc

与shell中一样,

反引号将以字符串(或数组,取决于上下文)的形式生成命令的标准输出。它们可以更清楚地写成类似引号的qx操作符。

@lines = `./sap_calc.pl $id`;
@lines = qx(./sap_calc.pl $id);
$all = `./sap_calc.pl $id`;
$all = qx(./sap_calc.pl $id);

open也可以用于流式传输,而不是一次性全部读入内存(像qx那样)。这也可以绕过shell,从而避免各种引用问题。

open my $fh, '-|', './sap_calc.pl', $id;
while (readline $fh) {
    print "read line: $_";
}

最新更新