Perl:系统地取消引用匿名数组的元素

问题描述 投票:0回答:1

以下内容为我提供了编译错误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];
perl anonymous-types
1个回答
0
投票

[@$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]->@*

与数组切片一样,当块仅包含简单标量时,可以忽略块的卷发。但这不是您所拥有的。


请参见Perl Dereferencing Syntax

© www.soinside.com 2019 - 2024. All rights reserved.