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

6

我遵循的基本语法教程并没有解释清楚这一点:

使用前面或后面的下标符号访问数组之间是否存在实际/哲学/上下文依赖/棘手的区别?

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

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

3个回答

9
$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
底部有一个到目前为止没有人提到的区别。 - ikegami
切换答案。你的把它带到了……11! - Robottinosino

8
如果你打开warnings(你应该总是这样做),你会看到这个:
Scalar value @a[0] better written as $a[0]
当你使用@a[1]时。 @标记意味着“给我一些东西的列表”。当与数组下标一起使用时,它检索数组的一个切片。例如,@foo[0..3]检索数组@foo中的前四个项目。
当你写@a[1]时,你正在请求从@a中获取一个元素的切片。这完全可以,但是要更清晰地请求单个值,而不是切片,$a[1]。这样做非常重要,以至于Perl会在第一种方式下发出警告。

4
第一个返回一个标量变量,而第二个则返回数组切片....这两者完全不同!!

实际上,$a[1]形式产生的是一个标量值,而不是一个变量。 - brian d foy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接