2013-04-28 60 views
0

所以,我正在试验多维数组,并意识到我可以用不同的方式访问它们,但完成相同的任务(请参阅下面的代码)。当使用strict/warnings时,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 

实际上上面两个例子中是否有功能差异?为什么有**的线比其他线更糟?难道他们比对手更混乱?

在此先感谢。

回答

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

此特定问题与引用或取消引用无关。用语法$ a [n]获得数组@a的第n个元素。这受到英语语言(“这些”元素中的“这个”元素)的启发。使用@a []来获得数组切片,例如@a [0,1,2];然后使用@a [0,1,2]来获得一个数组切片。