0

因此,我正在尝试使用多维数组,并意识到我可以以不同的方式访问它们,但完成相同的任务(参见下面的代码)。当使用严格/警告时,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 

上面的两个示例实际上是否存在功能差异?为什么带**的行比其他行差?仅仅是因为他们比他们的同行更令人困惑吗?

提前致谢。

4

2 回答 2

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]
于 2013-04-28T04:59:56.680 回答
1

此特定问题与引用或取消引用无关。您可以使用语法 $a[n] 获得数组 @a 的第 n 个元素。这是受英语的启发(“这些”元素中的“这个”元素)。

@a[] 用于获取数组切片,例如@a[0,1,2];

于 2013-04-28T04:37:50.990 回答