我想创建一个多维数组,但正如我将要声明的那样,我不知道它将包含多少元素,所以我尝试了这个:
my @multarray = [ ][ ];
好吗?
答案 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'
但即使你使用那种看似简洁的语法,最好还是了解一下幕后发生的事情;它仍然是数组引用的嵌套结构。