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 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组作为参数传递给另一个脚本?

使用它时将参数传递给perl包

将参数传递给 Perl 子例程时,是不是会影响数据复制性能?

如何将向量作为参数传递给另一个向量?

为 PERL 脚本构建 CLI 参数的 Shell 脚本

如何将数组的值作为第二个参数传递给 awk 的 split 函数?