如何选择Data::Dumper中的参考

How to choose which is the reference in Data::Dumper

让我们考虑这个例子:

#!/usr/bin/env perl
use strict;
use Data::Dumper;

my $node = node(undef, undef, 'root');
my $root = $node;

$node = node($root, $node, 'tom');
push $root->{children}, $node; 

$node = node($root, $node, 'clarence');
push $root->{children}, $node;

Data::Dumper::Purity;
#$root->{children}[0]->{younger} = $root->{children}[1];

print Dumper $root;

sub node {
    return {
        parent => shift,
        prev   => shift,
        name   => shift,
        children => [],
    };
}

这给出了这个输出:

$VAR1 = {
          'parent' => undef,
          'prev' => undef,
          'name' => 'root',
          'children' => [
                          {
                            'parent' => $VAR1,
                            'prev' => $VAR1,
                            'name' => 'tom',
                            'children' => []
                          },
                          {
                            'parent' => $VAR1,
                            'prev' => $VAR1->{'children'}[0],
                            'name' => 'clarence',
                            'children' => []
                          }
                        ]
        };

我们可以清楚地看到root有2个children,分别是tomclarenceclarencetom的引用,真清楚$VAR1->{'children'}[0]

但是,如果我使用 $root->{children}[0]->{younger} = $root->{children}[1]; 添加对 tomclarence 的引用,输出会变得混乱:

$VAR1 = {
          'parent' => undef,
          'prev' => undef,
          'name' => 'root',
          'children' => [
                          {
                            'parent' => $VAR1,
                            'prev' => $VAR1,
                            'younger' => {
                                           'parent' => $VAR1,
                                           'prev' => $VAR1->{'children'}[0],
                                           'name' => 'clarence',
                                           'children' => []
                                         },
                            'name' => 'tom',
                            'children' => []
                          },
                          $VAR1->{'children'}[0]{'younger'}
                        ]
        };

是否有可能限制 Data::Dumper 或任何其他转储程序始终将某些键视为参考以便正确显示树?

因为 Data::Dumper 扫描结构深度优先,所以您无能为力,但我建议您使用

$Data::Dumper::Deepcopy = 1

这将在输出中复制散列值而不是插入交叉引用。这是结果

$VAR1 = {
          'prev' => undef,
          'children' => [
                          {
                            'parent' => $VAR1,
                            'name' => 'tom',
                            'younger' => {
                                           'children' => [],
                                           'prev' => $VAR1->{'children'}[0],
                                           'name' => 'clarence',
                                           'parent' => $VAR1
                                         },
                            'prev' => $VAR1,
                            'children' => []
                          },
                          {
                            'children' => [],
                            'prev' => {
                                        'parent' => $VAR1,
                                        'name' => 'tom',
                                        'younger' => $VAR1->{'children'}[1],
                                        'prev' => $VAR1,
                                        'children' => []
                                      },
                            'name' => 'clarence',
                            'parent' => $VAR1
                          }
                        ],
          'parent' => undef,
          'name' => 'root'
        };