vin*_*k89 1 arrays perl perlscript
我有2个Perl脚本,其中通过将array作为参数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";
Run Code Online (Sandbox Code Playgroud)
secondary_script.pl
#!/usr/bin/perl
my @var = @{$ARGV[0]};
print @var."\n";
Run Code Online (Sandbox Code Playgroud)
我正在传递数组引用作为secondary_script.pl往返于该数组的参数。在这里@var打印0结果,而不是通过传递的数组内容primary_script.pl。
将数组作为参数传递给另一个perl脚本的这种正确方法吗?
您可以使用system列表形式传递参数:
system $^X, $program_name, @array;
Run Code Online (Sandbox Code Playgroud)
列表形式绕过了外壳程序,因此它不会从您的参数(例如;和&外壳程序中)中解释元字符。
该$^X路径是perl当前正在运行的路径,很可能是您想要的路径,而不是再次搜索PATH。
保留第二个程序来根据需要解释您的参数有一些麻烦。我在《壳牌报价》一书中介绍了其中一些内容。
为了获得更好的建议,您将不得不多说些什么。
让我们看看程序中的其他一些内容。
在_secondary_script.pl_中,您尝试取消引用参数列表。但是,@ARGV是一个普通的命名数组。您不需要取消引用它。您可以这样写:
print "@ARGV\n";
Run Code Online (Sandbox Code Playgroud)
将参数列表放在双引号中可以通过在元素之间放置空格来对其进行插值。这样,您就不会在使用参考技巧了。
如果您尝试传递复杂的数据而不是简单的参数,则可以考虑某种序列化(JSON,Sereal等)并输出到标准输出并从标准输入读取:
use Data::Dumper;
my @array = qw/1 2 3 4 5/;
print Dumper(\@array);
Run Code Online (Sandbox Code Playgroud)
然后,在另一个程序中:
my $input = do { local $/; <STDIN> };
my $array = eval $input;
Run Code Online (Sandbox Code Playgroud)
该字符串eval有点危险(Perl的Storable字符串也很危险),但这就是想法。输入一些文本并反序列化它。
然后,您可以将这些程序合并到管道中:
$ perl first.pl | perl second.pl
Run Code Online (Sandbox Code Playgroud)
但是,您也可以通过从第一个程序打开管道来直接打印到第二个程序:
use Data::Dumper;
my @array = qw/1 2 3 4 5/;
open my $pipe, '|-', $^X, $other_program;
print {$pipe} Dumper(\@array);
Run Code Online (Sandbox Code Playgroud)