我遵循的基本语法教程并没有解释清楚这一点:
使用前面或后面的下标符号访问数组之间是否存在实际/哲学/上下文依赖/棘手的区别?
$ perl -le 'my @a = qw(io tu egli); print $a[1], @a[1]'
在两种情况下输出似乎是相同的。
$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]
Scalar value @a[0] better written as $a[0]当你使用
@a[1]
时。
@
标记意味着“给我一些东西的列表”。当与数组下标一起使用时,它检索数组的一个切片。例如,@foo[0..3]
检索数组@foo
中的前四个项目。@a[1]
时,你正在请求从@a
中获取一个元素的切片。这完全可以,但是要更清晰地请求单个值,而不是切片,$a[1]
。这样做非常重要,以至于Perl会在第一种方式下发出警告。$a[1]
形式产生的是一个标量值,而不是一个变量。 - brian d foy