我想修改一个别人写的脚本,我想把我的脚本和他的分开。
我编写的脚本以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: $_";
}