使用Hashes数组制作一个哈希

时间:2014-03-13 16:35:58

标签: arrays perl hash

我已经递归地为perl组合了一个哈希数组,看起来像这样:

[
    {
        'Default' => {
            'Elect' => { 'P' => 1 }
        }
    },
    {
        'Default' => {
            'Elect' => { 'A' => 1 }
        }
    },
    {
        'Default' => {
            'Elect' => { 'M' => 1 }
        }
    },
    {
        'Default' => {
            'Elect' => { 'I' => 1 }
        }
    },
    {
        'Default' => {
            'Picker' => { 'L' => 1 }
        }
    },
]

与哈希数组相比,我的目标是使其更加精简,看起来像一个哈希。无论如何,我可以使这个哈希数组看起来像哈希:

{
    'Default' =>{
        'Elect' =>{
            'P' => 1,
            'A' => 1,
            'M' => 1,
            'I' => 1,
        },
        'Picker' => {
            'L' => 1
        }
    }
}

1 个答案:

答案 0 :(得分:2)

嗯,这是一个简单的递归过程来合并两个哈希引用:

sub merge {
    my ($xs, $ys) = @_;
    while (my ($k, $v) = each %$ys) {
        if ('HASH' eq ref $v) {
            merge($xs->{$k} //= {}, $v);
        }
        else {
            $xs->{$k} = $v;
        }
    }
}

然后:

my $data = ...; # your input data structure
my $acc = {};
merge($acc, $_) for @$data;

$acc生成您想要的结果。

还有Hash::Merge模块,其中包含:

use Hash::Merge 'merge';
my $acc = {};
$acc = merge $acc, $_ for @$data;