Как я могу инициализировать 2D массив в Perl?

Как я инициализирую 2D массив в Perl?

Я пробую следующий код:

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

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

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

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

8
задан Peter Mortensen 2 May 2017 в 00:15
поделиться

3 ответа

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

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

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

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

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

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

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

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

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

  • массивы скаляров
  • массивы ссылок массивы скаляров
  • массивы ссылки массивы ссылок массивов скаляров
  • массивов ссылок хэшей скаляров
  • и т. д.
13
ответ дан 5 December 2019 в 07:58
поделиться
7
ответ дан 5 December 2019 в 07:58
поделиться

В 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
          ]
        ];
1
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: