散列哈希:如何获取密钥的出现次数?

时间:2013-04-21 02:31:58

标签: arrays perl hash

我有以下文本文件。

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

我想制作一个Hash of Hashes,其中KEY1为第一列,KEY2是它所发出的声音(第二列):bam,{ {1}}或zip,VALUE是该声音的出现次数。这样的数据结构是这样的:

boo

这是我到目前为止所拥有的

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

您怎么看?

3 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:3)

为什么每个二级键都指向一个arrayref而不是数字?我建议这样做:

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

当遇到每个二级密钥时,它将增加(++)的值。

答案 2 :(得分:3)

实际上这可以解决问题

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

如果要查看结果

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