2014-02-16 6 views
2

ПРИМЕЧАНИЕ: Посмотрите конец этого сообщения для окончательного объяснения.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 ]; 
} 
  1. Одна линия ввода передается одновременно к <> оператора
  2. split функция принимает эту линию в с помощью $_ и анализирует его на основе пробелов (по умолчанию).
  3. split затем возвращает СПИСОК.
  4. [ ] - анонимный массив, который обеспечивает структуру данных perl для списка, переданного split.
  5. push @AoA подталкивает ссылку на анонимный массив на свою очередь как элемент $AoA[0] (вторая ссылка на анонимный массив будет помещена в $ AoA 1 и т. Д.).
  6. Это продолжается во всем входном файле. После завершения @AoA представляет собой 2D-массив, содержащий опорные значения (скалярные значения) для каждого из ранее созданных анонимных массивов.
  7. С этого момента @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

+1

Вы попробовали то, что вы объяснили? Если да, то как ваш результат отличается от того, что вы ожидали? – fugu

+0

@FlyingFrog Да, я получил результаты, как я их описал. У меня не было ожиданий. Он работает, я просто хочу понять, «почему» он работает. – secJ

+1

'[ITEMS]' создает новый анонимный массив и возвращает ссылку на этот массив. Вы можете найти [справочное руководство по perl] (http://perldoc.perl.org/perlreftut.html#Making-References) или [этот другой вопрос] (http://stackoverflow.com/questions/6023821/perl-array- vs-list) полезно. –

ответ

1

Тот же код немного более прозрачный, и вы должны это понимать.

my $line; 
while ($line = <STDIN>) { 
    my @parts = split $line; 
    my $partsRef = \@parts; 
    push @AoA, $partsRef; 
} 

Теперь, если вы хотите напечатать вторую часть 5-й строки, вы могли бы сказать.

my $ref = @AoA[4]; 
my @parts = @$ref; 
print $parts[1]; 

Получите это?

+0

Да, я знаю. Спасибо, что нарушили эту часть. Я на 90%. Основываясь на некоторых других комментариях, я действительно хочу использовать использование '[]' и анонимного массива, в основном это вызвало мое замешательство в первую очередь. Я редактировал окончание до моего вопроса, чтобы включить мое понимание до сих пор. Правильно ли это? – secJ

+0

добавлено объяснение конец моего вопроса на основе вашего ввода. Благодарю. – secJ

0

Это то, что происходит:

  1. <> поместит строку в переменную по умолчанию $ _
  2. функция split будет читать $ _ и возвращает массив
  3. скобках [] возвращает скаляр, в нем будет ссылка на этот массив
  4. Эта ссылка затем проталкивается в массив @AoA

Когда вы делаете $ ССХ [8] [2 ] вы неявно разыменовываете скаляр. Это то же самое, что и $ AoA [8] -> [2].

+0

'[]' не возвращать ссылку на * этот * массив, а на вновь созданный массив с тем же содержимым. – choroba

+2

Nit: 'split' возвращает список, а не массив. – Kenosis

+0

@ Kenosis @choroba Основываясь на некоторых комментариях здесь, я действительно хочу захватить использование '[]' в качестве анонимного массива, что в основном вызвало мое замешательство в первую очередь. Я редактировал окончание до моего первоначального вопроса, чтобы включить мое понимание до сих пор. Соответствует ли это тому, к чему вы ехали? Спасибо – secJ

Смежные вопросы