2013-04-21 51 views
4

我有以下文本文件。散列哈希:如何獲得一個鍵的出現次數?

foo1 bam 
foo1 bam 
foo2 bam 
foo1 zip 
foo2 boo 
foo1 zip 
foo3 zip 

我想作哈希其中KEY1是一列的哈希,KEY2是它發出的聲音(列中有兩個):bamzip,或boo,和值是那聲音的出現次數爲。使得數據結構是這樣的:

$VAR1 = { 
     'foo1' => { 
         'bam' => [ 
            2 
            ], 
         'zip' => [ 
            2 
           ], 
         }, 
     'foo2' => { 
         'bam' => [ 
           1 
           ], 
         'boo' => [ 
           1 
           ], 
         }, 
     'foo3' => { 
         'zip' => [ 
            1 
           ], 
        } 
     } 

這裏是我到目前爲止

use strict; use warnings;  
open(my $fh, '<', 'file.txt') or die $!; 
my %HoH; 
while(<$fh>){ 
    chomp; 
    my @cols = split(/\t/, $_); 
    my $KEY1 = $cols[0]; 
    my $KEY2 = $cols[1]; 
    push(@{$HoH{$KEY1}{$KEY2}}, 1); # This actually creates a hash of hash of arrays 
} 

my %HoH_final; 
foreach my $KEY1 (%HoH) { 
    foreach my $KEY2 (keys %HoH{$KEY1}){ 
    my $count = scalar @{$HoH{$KEY1}{$KEY2}}; # get the size of that array 
     push(@{$HoH_final{$KEY1}{$KEY2}}, $count); 
    } 
} 

你覺得呢?

回答

5

難道你不需要下面的數據結構嗎?

{ 
    'foo1' => { 
     'bam' => 2, 
     'zip' => 2, 
    }, 
    ... 
} 

如果是這樣,

while (<$fh>) { 
    chomp; 
    my @cols = split /\t/; 
    ++$HoH{ $cols[0] }{ $cols[1] }; 
} 

如果你真的想要的元素組成的數組,

while (<$fh>) { 
    chomp; 
    my @cols = split /\t/; 
    ++$HoH{ $cols[0] }{ $cols[1] }[0]; 
} 
+0

是的,我認爲這是你寫的,我想要的。 – cooldood3490 2013-04-21 02:38:21

+2

注意:'++'在沒有警告的情況下認爲undef爲零,所以在這裏完美。 – ikegami 2013-04-21 02:40:16

3

是否有一個原因,每個二級重點指向一個數組引用,而不是號碼?我建議你做這樣的:

while(<$fh>){ 
    chomp; 
    my @cols = split(/\t/, $_); 
    $HoH{ $cols[0] }{ $cols[1] }++; 
} 

這將增加(++)的值,在每個二級重點遇到時。

+0

是的我認爲這就是我想要的。我只是不知道如何表達它。 – cooldood3490 2013-04-21 02:39:18

3

其實這也有問題

perl -F'\t' -ane'$h{$F[0]}{$F[1]}++' 

如果你想看到的結果

perl -MData::Dumper -F'\t' -ane'$h{$F[0]}{$F[1]}++}{print Dumper(\%h)'