Как я могу инициализировать 2D-массив в Perl? - PullRequest
8 голосов
/ 13 марта 2010

Как инициализировать двумерный массив в Perl?

Я пытаюсь следующий код:

 0 use strict;
10 my @frame_events = (((1) x 10), ((1) x 10));
20 print "$frame_events[1][1]\n";

но выдает следующую ошибку:

Невозможно использовать строку ("1") в качестве ссылки на ARRAY, когда используются "строгие ссылки" в строке ./dyn_pf.pl 20.

Этот синтаксис, кажется, только инициализирует одномерный массив при работе print "$ frame_events [1] \ n". Хотя Perl не выдает ошибок во время выполнения задания.

Ответы [ 4 ]

13 голосов
/ 13 марта 2010

Вы не можете иметь массив массивов в Perl, только массив ссылок на массивы.

my @frame_events = ([(1) x 10], [(1) x 10]);
print "$frame_events[1]->[1]\n";

Особый случай: вы можете опустить стрелку разыменования указателя между соседними скобками (квадратные или фигурные):

print "$frame_events[1][1]\n";

Как правило, вы не можете иметь:

  • массивы массивов (массивов ...)
  • массивы хешей (of ...)
  • хешей массивов
  • хешей хешей.

Вы можете иметь:

  • массивов ссылки на массивы ( ссылок на массивы ...)
  • массивы ссылок на хэши ( ссылок на ...)
  • хешей ссылок на массивы
  • хэши ссылки на хэши

Вы также можете иметь:

  • массивы скаляров
  • массивы ссылок массивов скаляров
  • массивы ссылок массивов ссылок массивов скаляров
  • массивы ссылок хешей скаляров
  • и т.д.
7 голосов
/ 13 марта 2010
1 голос
/ 13 марта 2010

В Perl массив с двумя массивами объединяется в один массив. Вы хотите ссылки на внутренние массивы, если не хотите, чтобы они были объединены. Вот дамп вашего кода:

use strict;
use Data::Dumper;
my @frame_events = (((1) x 10), ((1) x 10));
print Dumper(\@frame_events);

результат:

$VAR1 = [
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1,
          1
        ];

и, если вы переключитесь на создателей ссылок на массивы, используйте скобки вместо родителей с этим кодом:

use strict;
use Data::Dumper;
my @frame_events = ([(1) x 10], [(1) x 10]);
print Dumper(\@frame_events);

вы получите это:

$VAR1 = [
          [
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1
          ],
          [
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1
          ]
        ];
0 голосов
/ 26 августа 2017

Самый быстрый способ - использовать команду push.

$ размер = 10; нажмите @matrix, [(0) x $ размер] для (0 .. $ размер);

Это создаст массив 10x10, инициализированный нулями.

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