2016-07-19 1 views
0

Я читаю «нетерпеливый perl» от Лондона. Я тестирую пример из главы «Ссылка». Мне интересно, почему при автоподтверждении ссылки мне нужно поместить число (любое число) в [], тогда как при объявлении массива я могу просто использовать [] в качестве пустого массива. Благодарю.perl autovivification of array

сообщение
#!/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, рядом с„[]“ Глобальный символ„$ Вэл“требует явного имя пакета на referenceTest.pl линии 15.Execution из referenceTest.pl прерванную из-за ошибок компиляции ».

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

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

Спасибо за просветить меня.

+0

Есть два варианта использования '[]' здесь. '$ scal -> [2]' выполняет поиск индекса массива. '[]' создает ссылку на анонимный массив. – aschepler

ответ

3

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

+0

Большое спасибо !!! – lisprogtor