我有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";
secondary_script.pl
#!/usr/bin/perl
my @var = @{$ARGV[0]};
print @var."\n";
我将数组引用作为参数传递给secondary_script.pl
,并从那里取消引用该数组。
在这里@var
会打印0
作为结果,而不是primary_script.pl
传递的数组内容。
以正确的方式将数组作为参数传递给另一个perl脚本吗?
答案 0 :(得分:6)
您可以使用列表形式的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
有点危险(和so is Perl's 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);