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

ogsagwnx  于 2023-10-24  发布在  Perl
关注(0)|答案(2)|浏览(203)
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]是否相同?

rvpgvaaj

rvpgvaaj1#

如果变量携带一个值,它是一个标量,它需要一个$

$ary[0]

对于前导$,如果[]中存在表达式,则在标量上下文中对其进行计算。
如果它是一个多值量,那么变量以@(或%为关联数组)开始,就像上面提到的切片一样

@ary[0,-1], @ary[2..5]

其中在[]中需要一个返回整数列表的表达式。该表达式在列表上下文中求值。
对于单个索引,可以容忍@的使用(它可以工作),但它会引起警告

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

不要这样做。如果[]中的表达式在运行时碰巧返回单个值,则不会发出以@开头的警告。如果表达式旨在返回单个值,则该数量显然是标量,因此使用$开头。
现在Dumper库所做的是Dumper的设计决策...
一个例外是新的后缀解引用语法,

$arrayref->@*
$hashref->%*

其中产生列表的项以$开头。参见文档。传统上我们将其写为

@{ $arrayref }

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

@$arrayref

在perlreftut和perlref中可以看到这一点。

yc0p9oo0

yc0p9oo02#

是的,@var[...]语法被称为“切片”。它名义上接受一个列表,并从该列表给出的索引处提取数组的元素。下面是一个例子:

use strict;
my @test = qw/one two three four five/;
print join( ', ', @test[1..2] )."\n";

这给出:

two, three

在你的例子中,你传递的是一个标量,而不是一个列表,但是perl无论如何都会接受它。不过,它会警告你:

use strict;
my @test = qw/one two three four five/;
print @test[1];

输出量:

Scalar value @test[1] better written as $test[1] at so77095380.pl line 3.
two

相关问题