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

Rob*_*ino 4 syntax perl

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

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

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

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

ike*_*ami 8

$a[...]   # array element
Run Code Online (Sandbox Code Playgroud)

返回由索引表达式标识的一个元素,和

@a[...]   # array slice
Run Code Online (Sandbox Code Playgroud)

返回由多个元素标识的所有元素.

因此,

  • 您应该$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]
Run Code Online (Sandbox Code Playgroud)


fri*_*edo 7

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

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

当你使用@a[1].

该@印记的意思是"给我的东西的清单." 与数组下标一起使用时,它会检索数组的切片.例如,@foo[0..3]检索数组中的前四项@foo.

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