對(duì)散列按照數(shù)值排序是 sort 函數(shù)的常用法之一。比如,如果 %sales_amount 散列記錄部門銷售情況,那么在排序過程里做一次散列查找就可以讓我們將散列鍵字根據(jù)它們的數(shù)值排序:
# 從銷售額最高的部門到最低的部門
sub bysales { $sales_amount{$b} <=> $sales_amount{$a} }
for $dept (sort bysales keys %sale_amount) {
print "$dept => $sales_amount{$dept}\n";
}
你可以通過使用 || 或者 or 操作符級(jí)連多個(gè)比較的方法進(jìn)行額外層次的排序。這種方法相當(dāng)漂亮,因?yàn)楸容^操作符通常在相等的時(shí)候返回 0,這樣就令它們能落到下一個(gè)比較。下面,散列鍵字首先根據(jù)它們相關(guān)的銷售額排序,然后在根據(jù)鍵字本身進(jìn)行排序(以處理有兩個(gè)或多個(gè)部門銷售額相同的情況):
sub by_sales_then_dept {
$sales_amount{$b} <=> $sales_amount{$a}
||
$a cmp $b
}
for $dept (sort by_sales_then_dept keys %sale_amount) {
print "$dept => $sales_smount{$dept}\n";
}
原帖由 windows.li 于 2008-1-2 11:45 發(fā)表
--------------------------------------------------------------------------------------
如果各部門銷售額均不等,經(jīng)測(cè)試,也可以通過“or”落到下一個(gè)比較。。。...
# An array of references to anonymous hashes
my @employees = (
{ FIRST =>'Bill', LAST =>'Gates',
SALARY =>600000, AGE =>45 },
{ FIRST =>'George', LAST =>'Tester',
SALARY =>55000, AGE =>29 },
{ FIRST =>'Steve', LAST =>'Ballmer',
SALARY =>580000, AGE =>41 },
{ FIRST =>'Sally', LAST =>'Developer',
SALARY =>50000, AGE =>29 },
{ FIRST =>'Joe', LAST =>'Tester',
SALARY =>40000, AGE =>29 },
);
sub seniority {
$b->{SALARY} <=> $a->{SALARY}
or $b->{AGE} <=> $a->{AGE}
or $a->{LAST} cmp $b->{LAST}
or $a->{FIRST} cmp $b->{FIRST}
}
my @ranked = sort seniority @employees;
foreach my $emp (@ranked) {
print "$emp->{SALARY}\t$emp->{AGE}\t$emp->{FIRST}\t$emp->{LAST}\n";
}
sub seniority {
$b->{SALARY} <=> $a->{SALARY} #1
or $b->{AGE} <=> $a->{AGE} #2
or $a->{LAST} cmp $b->{LAST} #3
or $a->{FIRST} cmp $b->{FIRST} #4
}
原帖由 windows.li 于 2008-1-2 15:56 發(fā)表
---------------------------------
我將#2,#3,#4全部刪除后,程序Result不變!#2-4連排序都是對(duì)的!
---------------------------- ...
歡迎光臨 Chinaunix (http://72891.cn/) | Powered by Discuz! X3.2 |