2011-02-03 37 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)以獲得更好的解決方案。

相關問題