所以,我正在尝试使用多维数组,并意识到我可以用不同的方式访问它们,但是完成相同的任务(参见下面的代码)。当使用严格/警告时,Perl告诉我,我不应该使用**中注释中表示的形式。
use strict;
use warnings;
my @a=();
push @a, [([1,1,1])];
push @a, [([2,2,2],[2,2,2])];
push @a, [([3,3,3],[3,3,3],[3,3,3])];
push @a, [([4],[4,4,4],[4,4,4],[4,4,4],[4,4,4],[4,4,4])];
print scalar(@a)."\n"; #Prints Size of outer array == 4
print scalar(@{@a[3]})."\n"; #Prints number of arrays in slot 3 of @a == 6 **
#or alternatively
print scalar(@{$a[3]})."\n"; #Prints number of arrays in slot 3 of @a == 6
print scalar(@{@{@a[3]}[0]})."\n"; #Prints size of array in @a of (3,0) == 1 **
#or alternatively
print scalar(@{$a[3][0]}); #Prints size of array in @a of (3,0) == 1
上面两个例子中是否存在功能差异?为什么**线比其他线差?仅仅是因为他们比同行更混乱吗?
提前致谢。
答案 0 :(得分:2)
$a[...] # array element
返回索引表达式标识的一个元素,
@a[...] # array slice
返回由多个元素标识的所有元素。
因此,
$a[EXPR]
。事实上,如果不这样做,你可以收到警告。@a[LIST]
。两者之间存在另一个差异,并且它是微妙的:数组元素的索引表达式在标量上下文中计算,而数组切片的索引表达式在列表上下文中计算。
sub f { return @_; }
$a[ f(4,5,6) ] # Same as $a[3]
@a[ f(4,5,6) ] # Same as $a[4],$a[5],$a[6]
答案 1 :(得分:1)
此特定问题与引用或解除引用无关。使用语法$ a [n]获取数组@a的第n个元素。这是受英语语言的启发(“这些”元素中的“这个”元素)。
@a []用于获取数组切片,例如@a [0,1,2];