以下内容为我提供了编译错误Global symbol "$list" requires explicit package name at ./scratch line 19.
。如何正确访问匿名数组中的元素?
use warnings;
use strict;
use feature "say";
my @list1 = (10, 20, 30);
my @list2 = ("hello", "yellow", "mellow");
my $r1 = \@list1;
my $r2 = \@list2;
my @list = ($r1, $r2);
# Prints just fine
say join ", ", @$r1;
say join ", ", @$r2;
# This part gives compilation error
say join ", ", @$list[0];
say join ", ", @$list[1];
[@$list[0]
是@{ $list }[0]
的缩写,但您想要@{ $list[0] }
(或$list[0]->@*
)。
@array[1,2,3]
是等效于数组切片
( $array[1], $array[2], $array[3] )
数组切片的语法是
@NAME[LIST] # Named array
@BLOCK[LIST] # A block returning a reference.
EXPR->@[LIST] # An expression returning a reference. Perl 5.24+
例如,
@array[1,2,3]
@{ $ref }[1,2,3]
$ref->@[1,2,3]
[当块仅包含一个简单的标量时,可以省略块的卷曲。
例如,
@{ $ref }[1,2,3]
可以写为
@$ref[1,2,3]
这是您拥有的,但不是您想要的。您需要数组的元素。
@NAME # Named array
@BLOCK # A block returning a reference.
EXPR->@* # An expression returning a reference. Perl 5.24+
例如,
@array
@{ $ref }
$ref->@*
或者您的情况,
@{ $list[0] }
$list[0]->@*
与数组切片一样,当块仅包含简单标量时,可以忽略块的卷发。但这不是您所拥有的。