私はperlプログラミングに少し慣れていませんが、次のように定式化できるハッシュを持っています:
$hash{"snake"}{ACB2} = [70, 120];
$hash{"snake"}{SGJK} = [183, 120];
$hash{"snake"}{KDMFS} = [1213, 120];
$hash{"snake"}{VCS2} = [21, 120];
...
$hash{"bear"}{ACB2} = [12, 87];
$hash{"bear"}{GASF} = [131, 87];
$hash{"bear"}{SDVS} = [53, 87];
...
$hash{"monkey"}{ACB2} = [70, 230];
$hash{"monkey"}{GMSD} = [234, 230];
$hash{"monkey"}{GJAS} = [521, 230];
$hash{"monkey"}{ASDA} = [134, 230];
$hash{"monkey"}{ASMD} = [700, 230];
ハッシュの構造を要約すると、次のようになります。
%hash{Organism}{ProteinID}=(protein_length, total_of_proteins_in_that_organism)
このハッシュをいくつかの条件に従ってソートしたいと思います。最初に、タンパク質の総数が 100 を超える生物のみを考慮したいと思います。次に、生物の名前と最大のタンパク質とその長さを示したいと思います。
このために、私は次のアプローチをとっています。
foreach my $org (sort keys %hash) {
foreach my $prot (keys %{ $hash{$org} }) {
if ($hash{$org}{$prot}[1] > 100) {
@sortedarray = sort {$hash{$b}[0]<=>$hash{$a}[0]} keys %hash;
print $org."\n";
print @sortedarray[-1]."\n";
print $hash{$org}{$sortedarray[-1]}[0]."\n";
}
}
}
ただし、これは生物の名前をタンパク質の総数と同じ数だけ出力します。たとえば、「snake」を 120 回出力します。その上、ソート行で変数 $org と $prot を使用する必要があると思うので、これは適切にソートされていません。
最終的に、出力は次のようになります。
snake
"Largest protein": KDMFS [1213]
monkey
"Largest protein": ASMD [700]