我正在尝试编写一个包含对Perl中其他三个数组的引用的数组,但每当我这样做时,我都会收到编译错误。我不能以这种方式引用数组,或者我是否尝试引用我创建的数组错误?
use strict;
use warnings;
my @person1 = [ "Mike S", 32, 40000];
my @person2 = [ "Jim B", 54, 50000];
my @person3 = [ "Heather Q", 29, 60000];
my @ref1 = \@person1;
my @ref2 = \@person2;
my @ref3 = \@person3;
my @bigArray = [ @ref1, @ref2, @ref3];
for (my $i = 0; $i < $#bigArray; $i++) {
for (my $j = 0; $j < $#bigArray[$i]; $j++) {
print $bigArray[$i][$j];
}
}
答案 0 :(得分:3)
首先要做的事情。 []
创建一个数组引用,而不是列表,数组引用是标量。
所以:
my @person1 = [ "Mike S", 32, 40000];
创建一个包含数组ref。
的数组然后:
my @ref1 = \@person1;
...创建一个包含对该数组的引用的数组。
所以忘记所有这些并直接转换为标量中的数组引用。
my $ref1 = [ "Mike S", 32, 40000];
my $ref2 = [ "Jim B", 54, 50000];
my $ref3 = [ "Heather Q", 29, 60000];
接下来,你在这里做同样的事情:
my @bigArray = [ @ref1, @ref2, @ref3];
您可能实际上想要一个数组,因此请在右侧放置一个列表而不是数组引用。
my @bigArray = ( $ref1, $ref2, $ref3 );
Idiomatic Perl避免在您不需要时使用索引变量。
所以只需循环遍历数组中的项目:
for my $ref (@bigArray) {
然后对内部的每个数组引用执行相同的操作。这里的诀窍是你必须首先使用@
来尊重arrayref。
for my $item (@$ref) {
这样给你:
use strict;
use warnings;
my $ref1 = [ "Mike S", 32, 40000];
my $ref2 = [ "Jim B", 54, 50000];
my $ref3 = [ "Heather Q", 29, 60000];
my @bigArray = ( $ref1, $ref2, $ref3 );
for my $ref (@bigArray) {
for my $item (@$ref) {
print $item;
}
}
答案 1 :(得分:1)
不要使用[ ... ]
来协助数组变量。方括号用于数组引用。
将数组引用保留在标量变量中,而不是数组中。
迭代数组时,结束条件为<= $#
,否则您将错过最后一个元素。
my @person1 = ( "Mike S", 32, 40000 );
my @person2 = ( "Jim B", 54, 50000 );
my @person3 = ( "Heather Q", 29, 60000 );
my $ref1 = \@person1;
my $ref2 = \@person2;
my $ref3 = \@person3;
my @bigArray = ( $ref1, $ref2, $ref3 );
for (my $i = 0; $i <= $#bigArray; $i++) {
for (my $j = 0; $j <= $#{$bigArray[$i]}; $j++) {
print $bigArray[$i][$j];
}
}
为了避免逐个错误,您可以使用范围运算符迭代索引:
for my $i (0 .. $#bigArray) {
for my $j (0 .. $#{ $bigArray[$i] }) {
print $bigArray[$i][$j];
}
}