将数组转换为多维哈希

时间:2019-02-21 00:36:25

标签: arrays algorithm perl hashtable

我的任务是转换数组,其中包含带有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。有什么问题以及如何解决此任务?

2 个答案:

答案 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,因为这是最后输入的内容。