perl命令行反转矩阵

时间:2014-11-22 22:44:05

标签: perl matrix command line backticks

我想通过使用带有反引号的命令行将矩阵从一个perl文件传输到另一个文件。

在第一个文件perl上,source.pl:

use warnings;
use strict;

my @matrix = (
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
);

my $results = `perl other_file.pl @matrix`; #option 1
# my $results = `perl other_file.pl '@matrix'`; #option 2
print $results;

在other_file.pl

use strict
use warnings

my @matrix_other = $ARGV[0];
print "mat_adress = ".$matrix_other[1][2]."\n";

启动source.pl后,终端输出:

  • with option 1:sh:1:语法错误:“(”意外
  • 使用选项2:不能使用字符串(“ARRAY(0x6c0cb8)ARRAY(0x6df410)”...)作为ARRAY参考,而在other_file.pl第5行使用“strict refs”。

我也尝试在other_file.pl中使用Symbolic references但没有成功(输出为:“不是other_file.pl中的ARRAY引用”)

有什么想法吗? 非常感谢。

PS:命令行中的简单变量$ var没问题;

1 个答案:

答案 0 :(得分:1)

好的,从根本上讲 - 做你想要直接做的事是不可能的。数组是一种内存状态,它不方便打包以传递它。这就是为什么你得到像ARRAY(0x6c0cb8)这样的东西 - 那是因为它是数组(或子元素)占用的内存地址。

因此,无论如何,您需要先渲染数组,然后在子程序中解析它。

这是一个足够大的主题,有关于它的文档的整个部分: perlipc

根据你想要完成的具体内容,采取的方法会有所不同。对于试图做的事情,我首先想到的是Storable

use warnings;
use strict;

use Storable;

my @matrix = ( [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] );

my $tempfile = "matrix.$$";
store \@matrix, $tempfile;

my $results = `perl other_file.pl $tempfile`;    #option 1
print $results;

并在'other_file'中使用retrieve

use warnings;
use strict;
use Data::Dumper;

use Storable qw/retrieve/;

my ($filename) = @ARGV;

print Dumper retrieve($filename);

(尽管你应该使用File::Temp而不是临时文件的任意名称。)

但是,请查看perlipc,其中有很多关于如何来回传递信息的信息。