这是我的程序,但为什么不打印我的数组值呢。
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)
但为什么不是打印我的数组值呢。
答案 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 ", ", @$_;
}