perl автовивификация массива

Я читаю "нетерпеливый Perl" в Лондоне. Я тестирую пример из главы "Справочник". Мне интересно, почему при автовивификации ссылок мне нужно поместить число (любое число) в [], тогда как при объявлении массива я могу просто использовать [] в качестве пустого массива. Благодарю.

#!/usr/bin/env perl
use warnings;
use strict;
use Data::Dumper;

my $scal;
my $val = $scal->[2]->{somekey}->[1]->{otherkey}->[7]; 
# fails if [] instead of [7] or [1] or [99999];
# same result if [7] or [1] or [99999] is used;

$val->[3] = 19;

print Dumper $scal;
print "========\n";
print Dumper $val;
print "========\n";
print Dumper []; # this does not fail; 

Сообщение об ошибке было "синтаксическая ошибка в строке referenceTest.pl 7, рядом с"[]"Глобальному символу"$val"требуется явное имя пакета в строке referenceTest.pl 15. Выполнение файла referenceTest.pl прервано из-за ошибок компиляции."

================== И когда он работает, используя [7], результаты:

$VAR1 = [
          undef,
          undef,
          {
            'somekey' => [
                           undef,
                           {
                             'otherkey' => []
                           }
                         ]
          }
        ];
========
$VAR1 = [
          undef,
          undef,
          undef,
          19
        ];
========
$VAR1 = [];

Спасибо, что просветили меня.

2 ответа

->[] обращается к записи массива. Конечно, вам нужен индекс для этого. Автовивификация - это просто побочный эффект от обращения к чему-то, чего не существует. Если вы хотите назначить вместо этого, то, как легко предположил бы Капитан Очевидность, используйте оператор присваивания =: my $val = ($scal->[2]->{somekey}->[1]->{otherkey} = []);

Хорошее объяснение автовивификации здесь http://perlmaven.com/autovivification

Другие вопросы по тегам