初始化多维数组

时间:2014-11-30 16:34:17

标签: perl multidimensional-array

我想创建一个多维数组,但正如我将要声明的那样,我不知道它将包含多少元素,所以我尝试了这个:

my @multarray = [ ][ ];

好吗?

2 个答案:

答案 0 :(得分:3)

Perl不是C,你不需要初始化任何类型的数组。只需my @multarray即可。

观察

use strict;
use warnings;

my @data;

$data[2][2] = 99;
print $data[2][2], "\n";

perldoc perlol Declaration and Access of Arrays of Arrays上的部分将在此处提供帮助。

<强>输出

99

答案 1 :(得分:0)

Perl不直接支持多维数组;数组总是只是一系列标量。但是您可以创建对数组的引用,并将引用存储在数组中,这样您就可以模拟多维数组。

方括号表示法在此处用于创建数组文字并返回对它的引用。例如,以下内容创建一个('a','b',1234)数组并返回对它的引用:

my $ref_array = ['a','b',1234];

这是一个如何创建(我们可以称之为)多维数组文字的示例,维度为3x2:

my $multarray = [['a','b'],['c','d'],['e','f']];

所以你可以使用:

访问'c'(例如)
print($multarray->[1]->[0]);

现在,你说你不知道最终的尺寸是什么。没关系;在Perl中,您可以在概念上将数组视为无限大小;尚未分配的所有元素将返回为undef,无论其索引是否小于或等于迄今为止分配的最大索引。所以这就是你能做的:

my $multarray = [];

现在,您可以直接读取和写入任何索引和任何深度级别的任何元素:

$multarray->[23]->[19234]->[3] = 'a';
print($multarray->[23]->[19234]->[3]); ## prints 'a'

我一直使用的语法是“显式”语法,您可以显式创建和取消引用正在操作的所有数组引用。但为方便起见,Perl允许您在对数组引用进行括号索引时省略取消引用令牌,时取消引用顶级数组引用,必须始终使用{{1}显式取消引用令牌:

->

最后,如果您更喜欢使用数组变量(与我不同;我实际上更喜欢一直使用标量引用),您可以使用顶级数组变量而不是数组引用,在这种情况下你可以逃脱必须完全使用解除引用令牌:

$multarray->[23][19234][3] = 'a';
print($multarray->[23][19234][3]); ## prints 'a'

但即使你使用那种看似简洁的语法,最好还是了解一下幕后发生的事情;它仍然是数组引用的嵌套结构。