Perl - проблемы с пониманием массива массивов - PullRequest
1 голос
/ 10 февраля 2011

Я пытаюсь создать массив массивов, а затем сослаться на них.

Я делаю что-то вроде:

sub foobar
{
 my @array;
 my $i;
 for ($i = 0; $i < 1000; $i=$i+1)
 {
  my @row;
  $row[0] = $i;
  $row[1] = foo($bar);
  push @array , [@row];
 }
 return \@array;
}

Я могу получить значения через:

$array->[x]->[y];

Однако я не понимаю, зачем нужен второй ->. $ array -> [x] Я понимаю, что $ array является ссылкой. Но разве $ array -> [x] не должен быть массивом? Почему это не работает:

my @notarray = $array->[x];

Чем конкретно массив не заполнен сейчас? Поскольку это, конечно, не массив, содержащий $ i, foo ($ bar)

Как бы $ массив -> [x] -> [y] отличался бы для ссылки на массив ссылок на массивы?

Ответы [ 2 ]

4 голосов
/ 10 февраля 2011

Второй -> на самом деле не нужен.

Вот предложение: все значения массива Perl и значения хеш-функции должны быть скалярами. Это означает ссылку на строку, число или массив / хэш (а не на простой старый массив или хэш).

Таким образом, первый оператор -> разыменовывает массив и попадает в x-ю строку. Там есть не массив, а ссылка на массив. Таким образом, чтобы получить доступ к данным, вам теоретически понадобится еще один оператор ->.

Но получите это. Perl умный: он знает, что после одного доступа к массиву или хешу, если происходит другой доступ, единственный возможный способ - через ссылку на массив / хеш (потому что ваш первый доступ к массиву / хешу ДОЛЖЕН возвращать скаляр)! Так что вам не нужна вторая стрелка.

Подробнее см. perldata .

2 голосов
/ 10 февраля 2011

Когда вы

push @array, [@row];

, вы помещаете ссылку в массив.Это необходимо из-за правила Perl, что массивы сглаживаются.Таким образом, $ array -> [x] является ссылкой на массив строк, а не на сам массив строк.Однако между подписками стрелка необязательна.Таким образом, $array->[x]->[y] точно так же, как $array->[x][y] (что точно так же, как ${$array}[x][y], и т.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...