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
很长一段时间,我认为如果我想访问数组中的一个项,我只能使用$var[i]
(因为每本书都是这样写的)。
但是,最近我发现我也可以使用@var[i]
来访问该项目。
经过一些研究,我发现@var[i]
似乎是一个叫做切片的东西。$var[1]
和@var[1]
有什么区别?如果我只使用@var[i]
作为正确的值,@var[i]
和$var[i]
是否相同?
2条答案
按热度按时间rvpgvaaj1#
如果变量携带一个值,它是一个标量,它需要一个
$
。对于前导
$
,如果[]
中存在表达式,则在标量上下文中对其进行计算。如果它是一个多值量,那么变量以
@
(或%
为关联数组)开始,就像上面提到的切片一样其中在
[]
中需要一个返回整数列表的表达式。该表达式在列表上下文中求值。对于单个索引,可以容忍
@
的使用(它可以工作),但它会引起警告不要这样做。如果
[]
中的表达式在运行时碰巧返回单个值,则不会发出以@
开头的警告。如果表达式旨在返回单个值,则该数量显然是标量,因此使用$
开头。现在
Dumper
库所做的是Dumper
的设计决策...一个例外是新的后缀解引用语法,
其中产生列表的项以
$
开头。参见文档。传统上我们将其写为其中
{}
中的表达式需要返回一个数组引用。在这种情况下,内部有一个简单的标量变量,也可以写在perlreftut和perlref中可以看到这一点。
yc0p9oo02#
是的,
@var[...]
语法被称为“切片”。它名义上接受一个列表,并从该列表给出的索引处提取数组的元素。下面是一个例子:这给出:
在你的例子中,你传递的是一个标量,而不是一个列表,但是perl无论如何都会接受它。不过,它会警告你:
输出量: