2

我有 2 个 perl 脚本,通过将数组作为参数传递primary_script.pl来调用脚本。secondary_script.pl

我的代码如下所示:
primary_script.pl

#!/usr/bin/perl

use Data::Dumper;
my @array = qw/1 2 3 4 5/;
print Dumper(\@array);

my $arr = \@array;

system("perl secondary_script.pl $arr") ;

print "END\n";


次要脚本.pl

#!/usr/bin/perl

my @var = @{$ARGV[0]};
print @var."\n";

我将数组引用作为参数传递到secondary_script.pl那里并从那里取消引用该数组。这里@var打印0结果而不是传递的数组内容primary_script.pl

这是将数组作为参数传递给另一个 perl 脚本的正确方法吗?

4

1 回答 1

7

您可以使用system列表形式传递参数:

 system $^X, $program_name, @array;

列表形式绕过外壳程序,因此它不会解释您的参数(例如外壳程序中的;&)中的元字符。

$^X是当前运行的 perl 的路径,这可能是您想要的路径,而不是再次搜索 PATH。

让第二个程序随心所欲地解释你的论点是很复杂的。我在Quoting the Shell中介绍了其中的一些内容。

您必须更多地说明您正在尝试做的事情以获得更好的建议。

返回您的程序

让我们看看您的程序中的其他一些内容。

在 _secondary_script.pl_ 中,您尝试取消引用参数列表。但是,@ARGV是一个普通的命名数组。你不需要取消引用它。你可以写:

print "@ARGV\n";

将参数列表放在双引号中通过在元素之间放置空格来插入它。这样一来,您就不会在参考文献中耍花招。

如果您尝试传递复杂数据而不是简单参数,您可能会考虑某种序列化(JSON、Sereal 等)并输出到标准输出并从标准输入读取:

use Data::Dumper;
my @array = qw/1 2 3 4 5/;
print Dumper(\@array);

然后,在另一个程序中:

my $input = do { local $/; <STDIN> };
my $array = eval $input;

该字符串eval有点危险(Perl 的字符串也是如此Storable),但这就是想法。接受一些文本并反序列化它。

管道数据

然后,您将这些程序组合在一个管道中:

 $ perl first.pl | perl second.pl

但是,您也可以通过从第一个程序打开管道直接打印到第二个程序:

use Data::Dumper;
my @array = qw/1 2 3 4 5/;
open my $pipe, '|-', $^X, $other_program;
print {$pipe} Dumper(\@array);
于 2019-10-17T15:19:37.733 回答