使用散列哈希数作为计数器

时间:2018-05-25 14:11:45

标签: perl

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

{
    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得到的计数(坏名称,我知道......仅用于演示目的)。< / p>

我想我可以分两步完成。但是,当我将它们加载到%counts时,似乎应该有一种简单的方法来计算元素。有人能告诉我我在哪里出错吗?

1 个答案:

答案 0 :(得分:2)

您预期的数据结构存在缺陷。你需要二级哈希引用。

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

使用数组,您无法正确使用键/值对,最后只能使用有序列表。

一旦你使用哈希,你可以简单地使用var作为第一个键并计算其中的猫。任何地方都没有push任何东西。 Perl的autovivification将为您创建一切。

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

输出:

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

请查看perldscperlrefperlreftut了解详情。