如何选择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,分别是tom
和clarence
。 clarence
对tom
的引用,真清楚$VAR1->{'children'}[0]
。
但是,如果我使用 $root->{children}[0]->{younger} = $root->{children}[1];
添加对 tom
到 clarence
的引用,输出会变得混乱:
$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'
};
让我们考虑这个例子:
#!/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,分别是tom
和clarence
。 clarence
对tom
的引用,真清楚$VAR1->{'children'}[0]
。
但是,如果我使用 $root->{children}[0]->{younger} = $root->{children}[1];
添加对 tom
到 clarence
的引用,输出会变得混乱:
$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'
};