考虑这一段Perl代码,
$array[$x]->{“foo”}->[0]= “January”;
我将此代码分析如下:“array”中索引$ x的条目是hashref。关于这个哈希,当它的键是“foo”时,它的值是一个数组,这个数组的第0个元素是“1月”。我的分析是否正确?感谢。
答案 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为我们自动更新。