我正在使用一个数据集,我想这将要求我采用某种类型的OOP。我对此没有多少经验。基本上,我正在解析foreach
循环中的数据,并将结果添加到散列中。
至少在这个时候,只有大约8个不同的值,但这些值的多次“命中”。假设我创建了值color=>white
。好吧,color=>white
会再次出现,当我将其附加到哈希时,它只会覆盖现有的color=>white
。
我希望的是确定我追加color=>white
的次数。现在,显然有一种简单,愚蠢的方法可以做到这一点 - 某种切换,测试各种条件。只有事情是动态的。事情偶尔会改变。所以我需要能够在不经常更改脚本的情况下处理它。
所以理想情况下,最后,我能够检查每个键/值的哈希,看看它发生了多少次,而不知道我正在寻找哪个键/值。
有人在这里有任何建议吗?
答案 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 perllol和perldoc perldsc)以获得现代化和更好的解决方案。