我有以下文本文件.
foo1 bam foo1 bam foo2 bam foo1 zip foo2 boo foo1 zip foo3 zip
我想做一个Hash of Hashes,其中KEY1是第一列,KEY2是它产生的声音(第二列):bam,zip或boo,VALUE是该声音的出现次数.这样的数据结构是这样的:
$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); } }
你怎么看?
解决方法
你真的不想要以下数据结构吗?
{ '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]; }