如何确定向嵌套哈希附加内容的次数?

时间:2011-02-03 01:22:19

标签: perl oop loops hash

我正在使用一个数据集,我想这将要求我采用某种类型的OOP。我对此没有多少经验。基本上,我正在解析foreach循环中的数据,并将结果添加到散列中。

至少在这个时候,只有大约8个不同的值,但这些值的多次“命中”。假设我创建了值color=>white。好吧,color=>white会再次出现,当我将其附加到哈希时,它只会覆盖现有的color=>white

我希望的是确定我追加color=>white的次数。现在,显然有一种简单,愚蠢的方法可以做到这一点 - 某种切换,测试各种条件。只有事情是动态的。事情偶尔会改变。所以我需要能够在不经常更改脚本的情况下处理它。

所以理想情况下,最后,我能够检查每个键/值的哈希,看看它发生了多少次,而不知道我正在寻找哪个键/值。

有人在这里有任何建议吗?

2 个答案:

答案 0 :(得分:3)

您可以使用多级哈希,其中第一级是属性名,下一级是值,而值是计数。

my @data = qw(
    color white
    color blue
    color white
    size  10
    size  20
    size  10
    color yellow
    color blue
    color white
);

my %hash;
while (@data) {
    my ($key, $value) = splice @data, 0, 2;
    $hash{$key}{$value}++;
}

for my $key (keys %hash) {
    for my $value (keys %{$hash{$key}}) {
        print "'$key' was '$value' $hash{$key}{$value} times\n"
    }
}

打印:

'color' was 'white' 3 times
'color' was 'blue' 2 times
'color' was 'yellow' 1 times
'size' was '10' 2 times
'size' was '20' 1 times

答案 1 :(得分:2)

Perl使用此方法使用单个哈希模拟多级关联数组。它继承自AWK,古老而有缺陷,你不应该使用它......但无论如何它都很有趣。

my %hash;

while (<DATA>) {
    my ($key, @values) = split;
    $hash{$key, $_}++ for @values;
}

while (my ($keys, $count) = each %hash) {
    my ($key, $value) = split /\Q$;/, $keys;
    print "$key => $value => $count\n";
}

__DATA__
color white blue red green
size small medium
color red orange purple
size medium large

产生类似

的内容
color => blue => 1
color => green => 1
color => orange => 1
color => purple => 1
color => red => 2
color => white => 1
size => large => 1
size => medium => 2
size => small => 1

虽然哈希顺序是不可预测的。

请参阅Eric Strom的答案(并阅读perldoc perllolperldoc perldsc)以获得现代化和更好的解决方案。