Perl: систематическая разыменование элементов анонимного массива - PullRequest
0 голосов
/ 25 марта 2020

Следующее дает мне ошибку компиляции 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];

1 Ответ

5 голосов
/ 25 марта 2020

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

Когда блок содержит только простой скаляр ($NAME или $BLOCK), curlies блока можно опустить.

Например,

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

Как и в случае с фрагментом массива, curlies блока могут быть опущены, когда блок содержит только простой скаляр. Но это не то, что у вас есть.


См. Perl Разыменование синтаксиса .

...