首页 > 解决方案 > 使用散列数组的散列作为计数器

问题描述

尝试解析具有公共元素的数组以创建包含计数信息的新哈希。我试图创建的结构是这样的:

{
    var1 => [
        cat1 => 50,
        cat2 => 3,
        cat3 => 5
    ],
    var2 => [
       cat2 => 12,
       cat4 => 4,
       cat5 => 1
    ]
}

我知道如何制作数组的散列,但我不太清楚如何让内部数组表示上面的计数散列。我拥有的数据结构是一个数组数组,其中包含更多元素。但是,作为一个玩具示例,这是我正在尝试使用的内容:

#!/usr/bin/perl
use strict;
use warnings;
use autodie;

use Data::Dump;

my @array = (
    ["cat1", "var1"],
    ["cat2", "var1"],
    ["cat2", "var1"],
    ["cat2", "var2"],
    ["cat1", "var1"],
    ["cat1", "var1"],
);

my %counts;
for my $elem (@array) {
    push(@{$counts{$elem->[1]}}, $elem->[0]);
}
dd \%counts;

我不知道如何修改该push()调用以推送一个匿名数组,该数组的计数源自循环@array(坏名,我知道..仅用于演示目的)。

我想我可以分两步做到这一点。但是,当我将元素加载到%counts. 有人可以告诉我我要去哪里错了吗?

标签: perl

解决方案


您预期的数据结构有缺陷。您需要第二级的哈希引用。

{
    var1 => [       # {
        cat1 => 50,
        cat2 => 3,
        cat3 => 5
    ],              # }
    var2 => [       # {
       cat2 => 12,
       cat4 => 4,
       cat5 => 1
    ]               # }
}

使用数组,您不能正确地拥有键/值对,最终只能得到一个有序列表。

使用哈希后,您可以简单地使用 var 作为第一个键并计算其中的猫。任何地方都不需要push任何东西。Perl 的自动生成将负责为您创建所有内容。

my %counts;
foreach my $elem (@array) {
    #        var             cat 
    $counts{ $elem->[1] }->{ $elem->[0] }++;
}

输出:

{
    var1   {
        cat1   3,
        cat2   2
    },
    var2   {
        cat2   1
    }
}

查看perldscperlrefperlreftut以获取更多信息。


推荐阅读