# Perl 的高級排序手段 排序手段 語法: ``` my @sorted_array = sort sub_sort_method @original_array; ``` 這裡的 sub_sort_method 就是我們制定的排序策略,一般是一個sub routine 的名字,或者其代碼。 示例: ``` my @result = sort by_number @some_numbers; # sub by_number {$a <=> $b} my @result = sort { $a <=> $b} @some_numbers; # <=> 符號表示數位的比較和排序 my @descending = reverse sort { $a <=> $b} @some_numbers; my @string = sort {$a cmp $b} @any_strings; # cmp 表示字串的比較和排序 my @string = sort {"\L$a" cmp "\L$b"} @any_strings; # \L表示忽略大小寫 ``` Perl排序的理念是:你只要告訴他兩個元素的比較關係(用-1,0,1表示),Perl就會為你完成任意長度的比較。 比如 `{$a <=> $b}` 其實表示的是 `if ($a < $b) {-1} elsif ($a > $b) {1} else {0}` * `<=>`符號只是一個縮寫。Perl只要知道我們的`sort`類型,就會為任意多個元素完成排序。 * `== `根據value對hash表的key值進行排序 首先,要理解我們無法對hash表進行排序,不然就不叫hash了。 不過,根據hash表的value我們可以為相應的key實現排序。示例如下 ``` sub by_score {$score{$b} <=> $score{$a}}; # $b在前面是因為我們要從大到小降冪排列 my %score = ('barney" => 195, "fred" => 205, "dino" => 30); my @ranking = sort by_score keys %score; # 注意要這樣閱讀 sort by_score (keys %score) ``` 注意,by_score不是對key直接做比較,而是根據key比較value,然後反過來對key進行排序。通俗的例子就是張三和李四光憑名字無法排序,但是根據名字,我們找到他們的考試成績,然後反過來,對名字進行排序。這就是` {$score{$b} <=> $score{$a}}` 的工作。 == 二重排序與多重排序 前面的例子中,按照value進行了排名,但是如果value相同怎麼辦?如果我們希望對value相同的人按照字母順序再細排,該怎麼做呢?答案如下 ``` sub by_score_and_name { {$score{$b} <=> $score{$a}} # 按照value對key做降冪排列 or $a cmp $b # 按照字母順序再排序 } ``` 其實意思也很好理解。因為value相同,因此比較結果返回0,這個時候結果就由 or 的另一部分來決定了。 上面的例子是二重排序。同理可以推導多重排序的方法。