Perl 使用哈希数组的哈希作为计数器

Perl 使用哈希数组的哈希作为计数器,perl,Perl,尝试解析具有公共元素的数组以创建包含计数信息的新哈希。我试图创建的结构如下所示: { var1 => [ cat1 => 50, cat2 => 3, cat3 => 5 ], var2 => [ cat2 => 12, cat4 => 4, cat5 => 1 ] } 我知道如何使数组散列,但我不太明白如何让内部数组表示如上

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

{
    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
中时,似乎应该有一种简单的方法来计算元素。有人能告诉我哪里出了问题吗?

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

{
    var1 => [       # {
        cat1 => 50,
        cat2 => 3,
        cat3 => 5
    ],              # }
    var2 => [       # {
       cat2 => 12,
       cat4 => 4,
       cat5 => 1
    ]               # }
}
使用数组时,不能正确地拥有键/值对,而只能得到一个有序列表

一旦使用了散列,就可以简单地使用var作为第一个键,并对其中的猫进行计数。无需将任何东西推到任何地方。Perl将负责为您创建所有内容

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

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

请查看和以了解更多信息。

我不明白您在这里试图计算的是什么。你要计算的输入数据在哪里?我试图计算每个变量的猫的数量。Var是唯一的,这就是为什么我想将其作为散列键,但cats对每个Var都是通用的。这有意义吗?你不推,而是递增。“我不太明白如何让内部数组表示如上所述的计数散列”你展示的是数组散列。虽然您使用了胖逗号,就好像它在散列中一样,但实际上您有一个数组:
['cat1',50',cat2',3',cat3',5]
.Ahhh!我错误地思考了最终的数据结构。当然,它需要一个散列!非常感谢你!