ПРИМЕЧАНИЕ: Посмотрите конец этого сообщения для окончательного объяснения.Perl: Анонимные многомерные массивы
Это, вероятно, очень простой вопрос, но я все еще пытаюсь освоить некоторые основы в отношении ссылок на Perl и наткнулся на что-то на странице perldsc, которую я хотел бы подтвердить. Следующий код находится в генерирующей массив разделе Массивы:
while (<>) {
push @AoA, [ split ];
}
Очевидно, что <>
операции в цикле while
читает одну строку ввода в одновременно. Я предполагаю, что в этот момент строка помещается в анонимный массив через скобки [ ]
, мы назовем это @zero
. Затем команда split помещает все в заданную строку, разделенную пробелами внутри массива (например, первое слово назначается $zero[0]
, второе - $zero[1]
и т. Д.). Скалярную ссылку @zero
затем нажимают на @AoA
.
Следующая строка ввода передается через оператор <>
и получает назначение на совершенно новый анонимный массив (например @one
), а его скалярная ссылка надеваются на @AoA
.
После заполнения @AoA
я мог бы получить доступ к его содержимому с помощью вложенного цикла foreach
; первая итерация через «строки» (например, for $row (@AoA)
) и второй внутренний цикл foreach
для доступа к столбцам этой конкретной строки.
Последний (доступ сказал «столбцы» будет сделано dereferencing
(например, for $column (@$row)
) особенности $row
считывании предыдущим, «внешний» foreach
петли.
ли мое понимание правильно? Я предполагаю, что вы могли бы все равно доступ к любому элементу @AoA так же, как если бы он был назначен против анонимного? Это $element = $AoA[8][1];
.
Я хочу проверить мой мыслительный процесс здесь. Является автоматическим объявлением уникального анонимного массива каждый раз через петлевую часть autovivication
в Perl? Я думаю, это то, что меня отбрасывает. Спасибо.
EDIT: Основываясь на комментариях ниже, мое понимание об анонимном массиве все еще неясно, поэтому я хочу сделать снимок еще одним описанием, чтобы понять, соответствует ли оно всем.
Начиная с инструкции push @AoA, [split];
, split берет в строке от $ _ и возвращает list проанализирован whitepace. То, что list снято [ ]
, которое затем возвращает ссылку на массив. Эта ссылка на массив (созданная [ ]
) затем помещается на @AoA. Является ли это верным Re: [ ]
? Следующий шаг (разыменование/использование @AoA) был очень хорошо освещен @krico ниже.
ОКОНЧАТЕЛЬНЫЙ ОТВЕТ/ОБЪЯСНЕНИЕ: Основываясь на всех комментариях/отзывах, некоторые дальнейшие исследования с моей стороны и тестирование, похоже, мое понимание было правильным. Я сломаю его здесь, чтобы другие могли легко ссылаться на него позже. См. Ответ @ krico ниже для более явного представления кода, следующего за шагами, описанными здесь.
while (<>) {
push @AoA, [ split ];
}
- Одна линия ввода передается одновременно к
<>
оператора split
функция принимает эту линию в с помощью$_
и анализирует его на основе пробелов (по умолчанию).split
затем возвращает СПИСОК.[ ]
- анонимный массив, который обеспечивает структуру данных perl для списка, переданногоsplit
.push @AoA
подталкивает ссылку на анонимный массив на свою очередь как элемент$AoA[0]
(вторая ссылка на анонимный массив будет помещена в $ AoA 1 и т. Д.).- Это продолжается во всем входном файле. После завершения
@AoA
представляет собой 2D-массив, содержащий опорные значения (скалярные значения) для каждого из ранее созданных анонимных массивов. - С этого момента
@AoA
может быть разыменован соответствующим образом для работы с базовыми/ссылочными элементами, взятыми из входного файла. Метод разыменования по умолчанию - CIRCUMFIX (см. Ниже perlfef); однако с 5.19 доступен новый метод разыменования и будет выпущен в 5.20, POSTFIX. Статьи связаны ниже.
Ссылки: Perl References Documentation,Perl References Tutorial,Perl References Question noted by @Eli Hubert,Mike Friedman's blog post about differences between arrays and lists,Upcoming Postfix dereferencing in Perl, andPostfix dereferencing Article
Вы попробовали то, что вы объяснили? Если да, то как ваш результат отличается от того, что вы ожидали? – fugu
@FlyingFrog Да, я получил результаты, как я их описал. У меня не было ожиданий. Он работает, я просто хочу понять, «почему» он работает. – secJ
'[ITEMS]' создает новый анонимный массив и возвращает ссылку на этот массив. Вы можете найти [справочное руководство по perl] (http://perldoc.perl.org/perlreftut.html#Making-References) или [этот другой вопрос] (http://stackoverflow.com/questions/6023821/perl-array- vs-list) полезно. –