我有一个像这样的代码:
@VAR1 = {
'ID' => '1',
'Name' => '"ABC"'
},
{
'ID' => '2',
'Name' => '"EFG"'
};
我使用如下:
my @Var2 = ({
'A' => "B",
'C' => "D",
'E' => \@Var1
},
{
'A1' => "B1",
'C1' => "D1",
'E' => \@Var1
});
所以当我在AVar2上做一个Dumper时,它就像是:
$VAR1 = {
'A' => 'B',
'C' => 'D',
'E' => [
{
'ID' => '1',
'Name' => '"ABC"'
},
{
'ID' => '2',
'Name' => '"EFG"'
};
]
};
$VAR2 = { 'A' => 'B',
'C' => 'D',
'E' => $VAR1->{'E'}
};
为什么这不是在第二种情况下打印。虽然它打印在第一个位置?
答案 0 :(得分:1)
http://perldoc.perl.org/Data/Dumper.html
Data :: Dumper将对转储值时遇到的所有引用进行编目。交叉引用(以perl语法中的子结构名称的形式)将插入所有可能的点,保留原始值集中的任何结构相互依赖性。结构遍历是深度优先的,并且从第一个提供的值到最后一个按顺序进行。
你可以禁用它:
$ Data :: Dumper :: Deepcopy或$ OBJ-> Deepcopy([NEWVAL]) 可以设置为布尔值以启用结构的深层副本。然后仅在绝对必要时(即,打破参考周期)才进行交叉引用。默认值为0.
答案 1 :(得分:1)
看起来你在做什么
print(Dumper(@Var2));
正确使用时
local $Data::Dumper::Purity = 1;
print(Dumper(\@Var2));
此输出
$VAR1 = [
{
'A' => 'B',
'C' => 'D',
'E' => [
{
'ID' => '1',
'Name' => '"ABC"'
},
{
'ID' => '2',
'Name' => '"EFG"'
}
]
},
{
'A1' => 'B1',
'E' => [],
'C1' => 'D1'
}
];
$VAR1->[1]{'E'} = $VAR1->[0]{'E'};
以上确实可以准确地重建您的数据结构。你似乎期待
$VAR1 = [
{
'A' => 'B',
'C' => 'D',
'E' => [
{
'ID' => '1',
'Name' => '"ABC"'
},
{
'ID' => '2',
'Name' => '"EFG"'
}
]
},
{
'A1' => 'B1',
'E' => [
{
'ID' => '1',
'Name' => '"ABC"'
},
{
'ID' => '2',
'Name' => '"EFG"'
}
],
'C1' => 'D1'
}
];
但这并不等同于你拥有的东西。在您的原始结构中,
$Var2[0]{E}
和$Var2[1]{E}
都是对同一数组的引用$Var2[0]{E}[0]
和$Var2[1]{E}[0]
都是对同一哈希的引用$Var2[0]{E}[1]
和$Var2[1]{E}[1]
都是对同一哈希的引用在您的预期输出中,
$Var2[0]{E}
和$Var2[1]{E}
是对不同数组的引用$Var2[0]{E}[0]
和$Var2[1]{E}[0]
是对不同哈希的引用$Var2[0]{E}[1]
和$Var2[1]{E}[1]
是对不同哈希的引用您可以使用
获得所需的输出local $Data::Dumper::Deepcopy = 1;
但是,如果这样做,您的转储数据结构将与实际数据结构不同。