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

问题描述 投票:5回答:3

我遵循的基本语法教程对此不太清楚:

使用前一种或后一种下标符号访问数组之间是否存在任何实际/哲学/上下文相关/微妙的区别?

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

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

perl syntax
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]

8
投票

如果打开warnings(您应该始终这样做),您将看到以下内容:

标量值@a [0]最好写为$ a [0]

使用@a[1]时。

@标记的意思是“给我一些东西。”与数组下标一起使用时,它将检索数组的一个切片。例如,@foo[0..3]检索数组@foo中的前四项。

[写入@a[1]时,您是在@a中要求一个元素的切片。完全可以,但是要替换为单个值$a[1]则要清楚得多。如此之多,以至于Perl会以第一种方式警告您。


4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.