我的任务是转换数组,其中包含带有x
维哈希的x-1
键的哈希。
示例:
use Data::Dumper;
my $arr = [
{
'source' => 'source1',
'group' => 'group1',
'param' => 'prm1',
'value' => 1,
},
{
'source' => 'source1',
'group' => 'group1',
'param' => 'prm2',
'value' => 2,
},
];
my $res;
for my $i (@$arr) {
$res->{ $i->{source} } = {};
$res->{ $i->{source} }{ $i->{group} } = {};
$res->{ $i->{source} }{ $i->{group} }{ $i->{param} } = $i->{value};
}
warn Dumper $res;
my $res_expected = {
'source1' => {
'group1' => {
'prm1' => 1, # wasn't added, why ?
'prm2' => 2
}
}
};
但是,它无法按预期运行,未添加'prm1' => 1
。有什么问题以及如何解决此任务?
答案 0 :(得分:4)
问题在于,即使那里有东西,您也正在分配给源,并且丢失了它。只需执行||=
而不是=
,就可以了。
或更简单的是,只需使用Perl可以自动存活并忽略该事实。
my $res;
for my $i (@$arr) {
$res->{ $i->{source} }{ $i->{group} }{ $i->{param} } = $i->{value};
}
warn Dumper $res;
答案 1 :(得分:0)
for
循环中的前两行是引起您问题的原因。他们在循环的每个迭代中分配一个新的哈希引用(并擦除在先前迭代中输入的内容)。在perl中,无需像您一样设置参考。只需删除前两行,您的数据结构就会如您所愿。
您选择的方法仅显示'prmt' => 2
,因为这是最后输入的内容。