为什么这里Data::Dumper :: Dumper会打印$VAR1->{'AA'}[2]
而不是{ 1 => 6 }
?
#!/usr/bin/env perl
use warnings;
use strict;
use 5.10.0;
my @a = ( 'a', 'b', { 1 => 6 } );
my %h = (
'AA' => [ @a ],
'BB' => [ @a ],
);
say $h{BB}->[2]{1};
use Data::Dumper;
say Dumper \%h;
输出:
6
$VAR1 = {
'AA' => [
'a',
'b',
{
'1' => 6
}
],
'BB' => [
'a',
'b',
$VAR1->{'AA'}[2]
]
};
答案 0 :(得分:7)
在您的示例中,$VAR1->{'AA'}[2]
和$VAR1->{'BB'}[2]
是对同一哈希的引用。
Data::Dumper
不想多次打印变量。此行为更忠实地表示数据结构,并且它避免了可能遇到的任何无限循环。
e.g:
my $loop;
$loop = { 1 => \$loop };
print Dumper $loop;
输出
$VAR1 = {
'1' => \$VAR1
};
答案 1 :(得分:3)
Data::Dumper
有configuration variables,可以更改避免多次打印参考的行为。
$Data::Dumper::Deepcopy
或$OBJ->Deepcopy([NEWVAL])
可以设置为布尔值以启用结构的深层副本。然后仅在绝对必要时(即,打破参考周期)才进行交叉引用。默认值为0.
要将其集成到您的脚本中,只需本地化变量:
say do {
local $Data::Dumper::Deepcopy = 1;
Dumper \%h;
};
输出:
$VAR1 = {
'AA' => [
'a',
'b',
{
'1' => 6
}
],
'BB' => [
'a',
'b',
{
'1' => 6
}
]
};