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