1

次のように構築されたハッシュデータ構造のハッシュがあるとしましょう:

%HoH => (
     flintstones => {
               family_members    => "fred;wilma;pebbles;dino",
               number_of_members => 4,
     },
     jetsons => {
               family_members    => "george;jane;elroy",
               number_of_members => 3,
     },
     simpsons => {
               family_members    => "homer;marge;bart;lisa;maggie",
               number_of_members => 5,
     },

)

number_of_membersキー (この場合はファミリ)を最大値から最小値の順に並べ替えるにはどうすればよいですか? 次に、最高の2つを出力したいと思います。これは一般的な考え方ですが、間違っていることはわかっています。

foreach $value (
    sort {
    $HoH{$a}{$number_of_members} cmp $HoH{$b}{$number_of_members}
    } keys %HoH)
my $count = 0;
while ($key, $value) = each %HoH) {
    if (count <= 2){
        print "${HoH}{$key}\t$key{$value}";
    }
}
continue {
    $count++;
};

コードを印刷したい (スペースはタブで区切られている):

simpsons    homer;marge;bart;lisa;maggie
flintstones    fred;wilma;pebbles;dino
4

1 に答える 1

7

あなたは正しい軌道に乗っています。$aハッシュでおよび内部変数を使用し$b、値を数値的に比較します ( <=>not cmp)。

印刷するときは、キーを配列に格納し、配列スライスを使用してそれらにアクセスするのが最も簡単だと思います。

use strict;
use warnings;

my %HoH = (
     flintstones => {
               family_members    => "fred;wilma;pebbles;dino",
               number_of_members => 4,
     },
     jetsons => {
               family_members    => "george;jane;elroy",
               number_of_members => 3,
     },
     simpsons => {
               family_members    => "homer;marge;bart;lisa;maggie",
               number_of_members => 5,
     },    
);
my @sorted = sort { $HoH{$b}{'number_of_members'} <=> 
                    $HoH{$a}{'number_of_members'} } keys %HoH;

for (@sorted[0,1]) {   # print only first two
    print join("\t", $_, $HoH{$_}{'family_members'}), "\n";
}

出力:

simpsons        homer;marge;bart;lisa;maggie
flintstones     fred;wilma;pebbles;dino
于 2013-02-18T19:18:45.717 に答える