数组的perl autovivification

时间:2016-07-19 00:11:37

标签: arrays perl autovivification

我正在阅读伦敦的“不耐烦的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 个答案:

答案 0 :(得分:3)

->[]正在寻址数组条目。当然你需要一个索引。自动生成只是一种不存在的地址的副作用。如果你想改为分配,那么,正如Captain Obvious愿意建议的那样,使用赋值运算符=my $val = ($scal->[2]->{somekey}->[1]->{otherkey} = []);

答案 1 :(得分:0)

这里对自动复原的一个很好的解释http://perlmaven.com/autovivification