【问题标题】:perl command line backticks with matrixperl 命令行反引号与矩阵
【发布时间】:2014-11-22 22:44:04
【问题描述】:

我想使用带反引号的命令行将 矩阵 从一个 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后,终端输出:

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

我也尝试在 other_file.pl 中使用 Symbolic references 但没有成功(输出为:“Not an ARRAY reference at other_file.pl”)

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

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

【问题讨论】:

  • 您不能将二维数组插入到这样的字符串中。 ARRAY(0x6c0cb8) 是已字符串化的数组引用。此外,您不能像这样通过 shell 将一个变量传输到另一个 Perl 程序——如果您想要这样,您需要使用 Perl 连接这些程序。
  • 您需要以一种或另一种方式呈现然后解析以在命令行上传输。像Storable 这样的东西可能会奏效吗?

标签: perl matrix command line backticks


【解决方案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;

在“其他文件”中使用retrieve

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

use Storable qw/retrieve/;

my ($filename) = @ARGV;

print Dumper retrieve($filename);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2015-05-29
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多