Perl引用不打印预期值

时间:2017-07-12 16:05:45

标签: perl

这是我的程序,但为什么不打印我的数组值呢。

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

my (@arr1,@arr2) = ([1,1,1,2,3,4],[5,5,5,6,9,87]);
my @arr3 = [\@arr1,\@arr2];
foreach (@arr3){
    foreach (@$_){
       print $_;
    }
}

输出:

ARRAY(0x556414c6b908)ARRAY(0x556414c6b7e8)

但为什么不是打印我的数组值呢。

2 个答案:

答案 0 :(得分:5)

因为值是数组引用。要打印内部值,请使用取消引用:

print @{ $array_ref };

对于复杂结构(数组数组),您可以使用Data::Dumper

use Data::Dumper;
print Dumper($array_ref);

但它仍然行不通。您不能一次分配给多个阵列。第一个数组获取所有值,其余数组保持为空。

记录在perlsub中:

  

但是,不要试图这样做:

    (@a, @b)   = upcase(@list1, @list2);
     

与展平的传入参数列表一样,返回列表也是如此       回来后变平了。所以你在这里设法做的就是存储       @a中的所有内容都使@b为空。

答案 1 :(得分:2)

首先,您没有向@arr2分配任何内容。您使用以下内容尝试分配给@arr2

(@arr1, @arr2) = ...;

但是,Perl无法知道要分配给@arr1的标量数量以及分配给@arr2的标量数量,因此它会将所有标量分配给@arr1。改为使用两种不同的作业。

其次,[ ]创建一个数组,返回对它的引用,所以

my @arr1 = [1,1,1,2,3,4];

@arr1指定单个标量(引用)。这就是你要打印的东西。你想要

my @arr1 = (1,1,1,2,3,4);

同样适用于@arr2@arr3

因此,您的代码应为

use strict;
use warnings;
use feature qw( say );

my @arr1 = (1,1,1,2,3,4);
my @arr2 = (5,5,5,6,9,87);
my @arr3 = (\@arr1,\@arr2);
for (@arr3) {
   say join ", ", @$_;
}

use strict;
use warnings;
use feature qw( say );

my @arr3 = ([1,1,1,2,3,4],[5,5,5,6,9,87]);
for (@arr3) {
   say join ", ", @$_;
}