如何在Perl中创建数组引用数组?

时间:2014-04-30 20:09:47

标签: arrays perl reference

我正在尝试编写一个包含对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];
        }
}

2 个答案:

答案 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];
    }
}