在Perl中,使用@a [$ i]而不是使用$ a [$ i]访问数组元素有什么区别?

时间:2013-03-31 03:33:52

标签: perl syntax

我遵循的基本语法教程没有说清楚:

  

使用前一个或后一个下标符号访问数组之间是否有任何实际/哲学/上下文相关/棘手的区别?

$ perl -le 'my @a = qw(io tu egli); print $a[1], @a[1]'

两种情况下的输出似乎相同。

3 个答案:

答案 0 :(得分:8)

$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 :(得分:7)

如果你打开warnings(你应该总是这样),你会看到:

Scalar value @a[0] better written as $a[0]

使用@a[1]时。

@ sigil的意思是“给我一份清单。”与数组下标一起使用时,它会检索数组的切片。例如,@foo[0..3]检索数组@foo中的前四项。

当你写@a[1]时,你要求@a的单元素切片。这完全没问题,但要求单个值$a[1]更清楚。如果你是第一种方式,那么Perl会警告你。

答案 2 :(得分:4)

第一个产生标量变量,第二个产生数组切片....非常不同的动物!!