У вас много чего происходит и несколько уровней непреднамеренных ссылок, поэтому давайте go пройдем через него:
Сначала вы создадите список из двух элементов, каждый из которых является ссылкой на массив , Вы сохраняете это в массиве:
my @list0 = ( \@list2, \@list2 );
Затем вы запрашиваете элемент с индексом 2, который является отдельным элементом, и сохраняете это в массиве:
my @listRef = $list0[2];
Однако, нет элемента с индексом 2, потому что Perl индексируется с нуля. Значение в @listRef
не определено. Кроме того, вы запросили один элемент и сохранили его в массиве вместо скаляра. Это, вероятно, не то, что вы имели в виду.
Вы говорите, что следующая строка работает, но я не думаю, что вы знаете это, потому что она не даст вам ожидаемого значения, даже если вы не получили ошибку , Что-то еще происходит. Вы не объявили или не использовали переменную $listRef
, поэтому Perl создает ее для вас и присваивает ей значение undef
. Когда вы пытаетесь разыменовать его, Perl использует «автовивификацию» для создания ссылки. Это процесс, в котором Perl помогает создать справочную структуру для вас, если вы начинаете с undef
:
my @list = @$listRef; # works
В этом массиве нет ничего, поэтому @list
должно быть пустым.
Исправьте это, чтобы получить последний элемент с индексом 1, и исправьте его так, чтобы вы присваивали единственное значение (ссылку) скалярной переменной:
my $listRef = $list0[1];
Data :: Dumper удобен здесь:
use Data::Dumper;
my @list2 = qw(a b c);
my @list0 = ( \@list2, \@list2 );
my $listRef = $list0[1];
print Dumper($listRef);
Вы получите вывод:
$VAR1 = [
'a',
'b',
'c'
];
Perl имеет некоторые функции, которые могут отлавливать такие ошибки именования переменных и помогут вам отследить проблемы. Добавьте это в начало вашей программы:
use strict;
use warnings;
В остальном вы можете проверить мою книгу Средний Perl, в которой объясняются все эти справочные материалы.
И последние Perls имеют новую функцию, называемую разыменование постфикса , которая позволяет писать разыменования слева направо:
my @items = ( \@list2, \@list2 );
my @items_of_last_ref = $items[1]->@*;