我如何在树中移动到下一个孩子?

问题描述 投票:2回答:2

我尝试自己建造一棵树。我从一个匿名哈希开始,并创建了第一个结(“那里”)。从那以后,我想创建一个子结,但是我尝试的没有成功。

use Data::Dumper;
$tree = {};
$tree->{'these'} = {};
$tree = $tree->{'these'};
$tree->{'are'} = {};
print Dumper $tree;

$tree = $tree->{'these'};不会将$tree移动到匿名哈希。输出是

$VAR1 = {
          'are' => {}
        };

但我希望成为

$VAR1 = {
          'these' => {
                     'are' => {}
                     }
        };

任何想法都很感激。

perl hash tree move
2个回答
1
投票

考虑:

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;


0
投票

让我们先看一下您写的最后两行:

$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));
© www.soinside.com 2019 - 2024. All rights reserved.