Perl 如何将数组作为参数传递给另一个 Perl 脚本
Posted
技术标签:
【中文标题】Perl 如何将数组作为参数传递给另一个 Perl 脚本【英文标题】:Perl how to pass array as an argument to another Perl script 【发布时间】:2019-10-17 14:50:28 【问题描述】:我有 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 脚本的正确方法吗?
【问题讨论】:
如果您将use strict
添加到您的程序中,您将看到一个警告:Can't use string ("ARRAY(0x55eaf6009578)") as an ARRAY ref while "strict refs" in use
总是使用use strict; use warnings;
只有字符串可以作为参数传递(并且它们不能包含 NUL 字符)。您需要序列化数据并在孩子中反序列化。 JSON 可能是一个不错的选择。
序列化选项:***.com/a/10684780/46395
【参考方案1】:
您可以只传递参数,使用列表形式的system
:
system $^X, $program_name, @array;
列表形式绕过 shell,因此它不会解释来自参数的元字符(例如 shell 中的 ;
和 &
)。
$^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);
【讨论】:
其实secondary_script.pl
在不同的服务器上。所以我在primary_script.pl
中对该服务器进行ssh 并调用辅助脚本。
这样的话,*** 已经有了一些不错的答案,包括***.com/questions/7986572/…以上是关于Perl 如何将数组作为参数传递给另一个 Perl 脚本的主要内容,如果未能解决你的问题,请参考以下文章