我尝试自己建造一棵树。我从一个匿名哈希开始,并创建了第一个结(“那里”)。从那以后,我想创建一个子结,但是我尝试的没有成功。
use Data::Dumper;
$tree = {};
$tree->{'these'} = {};
$tree = $tree->{'these'};
$tree->{'are'} = {};
print Dumper $tree;
$tree = $tree->{'these'};
不会将$tree
移动到匿名哈希。输出是
$VAR1 = {
'are' => {}
};
但我希望成为
$VAR1 = {
'these' => {
'are' => {}
}
};
任何想法都很感激。
考虑:
use strict;
use warnings;
use Data::Dumper;
my $tree = {};
$tree->{these}->{are} = {};
print Dumper $tree;
理论值:您的原始代码不断将新值分配给$tree
,覆盖先前分配的值:
$tree->{'these'} = {}; # original assignment
$tree = $tree->{'these'}; # new assignment: now $tree is an empty hash ref
$tree->{'are'} = {}; # new assignment: now $tree contains { are => {} }
这里是使用另一个变量表达意图的另一种方法:
use strict;
use warnings;
use Data::Dumper;
my $tree = {};
my $child_tree = {};
$child_tree->{are} = {};
$tree->{these} = $child_tree;
print Dumper $tree;
无关的旁注:总是 use strict; use warnings;
!
让我们先看一下您写的最后两行:
$tree->{'are'} = {};
print Dumper $tree;
之后,$tree
怎么可能成为对仅包含键these
的哈希的引用?
问题是您试图将$tree
用于两种不同的事物:
这两个哈希/节点并不总是相同的,因此我们需要两个变量。实际上,为了清楚起见,我将使用三个。
$tree
,对根节点的引用。 $node
我们正在创建的节点。$parent
我们要插入的节点。我们首先创建一个根节点并将其分配给$tree
my $tree = {};
我们不想丢失根节点,因此我们永远不会再分配给$tree
。不过,我们可以分配$tree
引用的哈希元素。
下一次插入时,我们想插入到根节点中。
my $parent = $tree;
现在是时候开始添加新节点了。
my $node = {};
$parent->{these} = $node;
下一次插入时,我们想插入到新创建的节点中。
$parent = $parent->{these};
我们再次插入。
my $node = {};
$parent->{are} = $node;
就是这样!一起:
use strict; # ALWAYS use this.
use warnings; # ALWAYS use this.
use Data::Dumper qw( Dumper );
my $tree = {};
my $parent = $tree;
{
my $node = {};
$parent->{these} = $node;
$parent = $parent->{these};
}
{
my $node = {};
$parent->{are} = $node;
$parent = $parent->{are};
}
print(Dumper($tree));
如果清楚,我们可以简化一下。
use strict; # ALWAYS use this.
use warnings; # ALWAYS use this.
use Data::Dumper qw( Dumper );
my $tree = {};
my $parent = $tree;
$parent->{these} = {};
$parent = $parent->{these};
$parent->{are} = {};
$parent = $parent->{are};
print(Dumper($tree));
我们甚至可以更进一步!
use strict; # ALWAYS use this.
use warnings; # ALWAYS use this.
use Data::Dumper qw( Dumper );
my $tree = {};
my $parent = $tree;
$parent = $parent->{these} = {};
$parent = $parent->{are} = {};
print(Dumper($tree));