按散列值排序Perl
假设我有一个哈希数据结构,构造如下:按散列值排序Perl,perl,sorting,hash-of-hashes,Perl,Sorting,Hash Of Hashes,假设我有一个哈希数据结构,构造如下: %HoH => ( flintstones => { family_members => "fred;wilma;pebbles;dino", number_of_members => 4, }, jetsons => { family_members => "george;jane;elro
%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,
},
)
我如何根据成员的值编号从最大到最小对键(在本例中为族)进行排序?然后我想打印出最高的两个。这里有一个大致的想法,但我知道它是错误的:
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++;
};
你在正确的轨道上。在散列中使用$a和$b内部变量,并以数字形式比较值,而不是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";
}
你在正确的轨道上。在散列中使用$a和$b内部变量,并以数字形式比较值,而不是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";
}
将cmp替换为。你做了一个数值比较来代替cmp。你在做一个数字比较。我必须仔细看一看才能弄明白一切,但我明白它的要点。@cooldood3490不客气。请随时询问是否有不清楚的地方。谢谢。我必须仔细看一看才能弄明白一切,但我明白它的要点。@cooldood3490不客气。请随意询问是否有不清楚的地方。
simpsons homer;marge;bart;lisa;maggie
flintstones fred;wilma;pebbles;dino