【问题标题】:Making one hash with array of Hashes用哈希数组制作一个哈希
【发布时间】:2014-04-18 13:42:36
【问题描述】:

我已经递归地为 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
        }
    }
}

【问题讨论】:

  • 你从哪里得到散列数组?我们当然可以根据您的要求向您展示如何修改您的数组,但如果可能的话,最好从一开始就构建正确的数据结构。

标签: arrays perl hash


【解决方案1】:

好吧,这里有一个简单的递归过程来合并两个哈希引用:

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;

【讨论】:

  • 你几乎是对的。问题是 $xs 每次都会重新初始化。因此,如果您宁愿通过 $_[0] 而不是 $xs 它可以完美运行。谢谢
  • @user2583714 我测试了我的代码。它工作得很好,因为两个输入都是references。在这种情况下,给它们起 $xs$ys 之类的名称不会妨碍正确的功能,并使代码更易于阅读。
  • 也许我做错了什么。工作对我来说是完美的,我的方式。还是非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2014-03-30
  • 2013-01-23
  • 2014-12-10
  • 2021-02-05
相关资源
最近更新 更多