2011-02-03 73 views
1

我正在处理一个要求我使用某种类型的OOP的数据集,我想。我没有太多的经验。基本上,我正在解析foreach循环中的数据,并将结果添加到散列。如何确定将某些东西附加到嵌套散列的次数?

至少在这个时候,只有8个不同的值,但是这些值有多个“命中”。假设我创建了值color=>white。那么,color=>white会再次出现,当我将它追加到散列表中时,它只会覆盖现有的color=>white

我期望的是确定我追加color=>white的次数。现在,显然有一种简单,愚蠢的方式来做到这一点 - 一种类型的转换,测试各种条件。只有东西是动态的。事情偶尔会改变。所以我需要能够在不改变脚本的情况下处理这个问题。

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

有没有人有任何建议吗?

回答

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 
+0

是的。 [perldsc](http://perldoc.perl.org/perldsc.html)还有其他一些例子,相关主题还有很多其他的perldoc。 (更不用说每本好的Perl书都应该涵盖这个主题。) – ephemient 2011-02-03 02:20:54

+0

太棒了!非常感谢。完美的作品。 – user571658 2011-02-03 03:40:39

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)以获得更好的解决方案。

相关问题