尝试使用公共元素解析数组以创建包含计数信息的新哈希。我想要创建的结构是这样的:
{
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
时,似乎应该有一种简单的方法来计算元素。有人能告诉我我在哪里出错吗?
答案 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
}
}
请查看perldsc,perlref和perlreftut了解详情。