$var[1] 和 @var[1] 有什么区别?

Lan*_*ane 4 perl

use 5.016;
use Data::Dumper;

my @var = (11, 22, 33);

# I think this is the TYPICAL use
say Dumper $var[1];  # output: 22
$var[1] = 88;
say Dumper $var[1];  # output: 88

# What's the difference?
say Dumper @var[1];  # output: 88
@var[1] = 99;
say Dumper @var[1];  # output: 99
Run Code Online (Sandbox Code Playgroud)

很长一段时间,我想如果我想访问数组中的一项,我只能使用$var[i](因为每本书都是这样写的)。

但是,最近我发现我@var[i]也可以使用它来访问该项目。

经过一番研究,我发现它似乎@var[i]是一种叫做切片的东西。

$var[1]和 和有什么区别@var[1]?如果我只用作@var[i]正确的值,是@var[i]$var[i]一样吗?

zdi*_*dim 6

如果变量携带单个值,那么它是一个标量,并且需要一个$. 如此严格

$ary[0]
Run Code Online (Sandbox Code Playgroud)

对于前导$,如果其中有表达式,[]则在标量上下文中进行计算。

如果它是多值量,则变量以 a 开头@(或%对于关联数组),就像提到的切片一样

@ary[0,-1], @ary[2..5]
Run Code Online (Sandbox Code Playgroud)

其中[]需要一个返回整数列表的表达式。该表达式在列表上下文中进行计算。

对于单个索引,可以容忍使用@(它有效),但它会引起警告

Scalar value @ary[0] better written as $ary[0]
Run Code Online (Sandbox Code Playgroud)

不要那样做。如果运行时中的表达式[]碰巧返回单个值,则不会发出带有前导 的警告@。如果表达式旨在返回单个值,那么该数量显然是一个标量,因此请使用前导$

现在Dumper图书馆所做的是Dumper设计决策......


一个例外是新的后缀取消引用语法,

$arrayref->@*
$hashref->%*
Run Code Online (Sandbox Code Playgroud)

其中产生列表的术语以$。请参阅文档。传统上我们将其写为

@{ $arrayref }
Run Code Online (Sandbox Code Playgroud)

其中表达式{}需要返回数组引用。在这种情况下,内部有一个简单的标量变量,也可以写

@$arrayref
Run Code Online (Sandbox Code Playgroud)

请参阅perlrefutperlref