我对Perl autovivification示例的分析

时间:2011-12-22 04:33:18

标签: perl

考虑这一段Perl代码,

$array[$x]->{“foo”}->[0]= “January”;

我将此代码分析如下:“array”中索引$ x的条目是hashref。关于这个哈希,当它的键是“foo”时,它的值是一个数组,这个数组的第0个元素是“1月”。我的分析是否正确?感谢。

3 个答案:

答案 0 :(得分:11)

您对结构的分析是正确的,但相关的自动更新示例更像是:

#!/usr/bin/env perl

use strict;
use warnings;

use 5.10.0; # say

my @array;

# check all levels are undef in structure

say defined $array[0] ? 'yes' : 'no';         # no
say defined $array[0]{foo} ? 'yes' : 'no';    # no
say defined $array[0]{foo}[0] ? 'yes' : 'no'; # no

# then check again

say defined $array[0] ? 'yes' : 'no';         # yes (!)
say defined $array[0]{foo} ? 'yes' : 'no';    # yes (!)
say defined $array[0]{foo}[0] ? 'yes' : 'no'; # no

请注意,您尚未分配任何内容,实际上您所做的就是检查是否存在某些内容。当您在某个级别x检查多级数据结构时会发生自动生成,然后突然显示所有级别(x-1 ... 0)突然存在。

这意味着

say defined $array[0]{foo}[0] ? 'yes' : 'no';

实际上等同于

$array[0] = {};
$array[0]{foo} = [];
say defined $array[0]{foo}[0] ? 'yes' : 'no';

答案 1 :(得分:4)

是的,您的分析是正确的。

它不是一种自动化的分析,它是对多级数据结构的分析。

我们无法知道此处是否存在autoviv,因为我们无法确定是否存在任何中间值...

答案 2 :(得分:1)

tadmc有正确的答案。你的分析是正确的。然而,自动化是另一回事。考虑这个例子:

perl -wE 'my @a; $a[1]->{foo}->[0] = "aa"; use Data::Dumper; print Dumper \@a;'

$VAR1 = [
          undef,
          {
            'foo' => [
                       'aa'
                     ]
          }
        ];

在这个例子中,我们只声明一个数组@a。但是通过为@a中的想象结构赋值,我们会自动创建它。我们在@a中添加对第二个元素的哈希引用,并在该哈希中添加对键foo的数组引用。这不是我们宣布的内容,perl为我们自动更新。