數組和哈希的數值排序問題(sort)

在perl中對數組或者散列進行排序的工具是sort,在這兒,一般分爲兩種,字符串和數值(阿拉伯數字)排序問題,sort默認的情況是使用Ascall碼排序。
1、sort format
 >>  sort USERSUB LIST
 >>  sort BLOCK LIST
 >>  sort LIST
在此,LIST其實就是一個列表,比如一個數組,或者散列使用keys進行轉換。
缺省USERSUB或BLOCK時,默認的是標準字符串比較順序排序(未定義數值排在已定義空字符串前面,而空字符串又在其他任何東西前面)。如果use locale用法起作用,那麼sort LIST根據當前的區域集的數值對lIST進行排序。
2、一般情況下,字符之間的比較用cmp,數值比較用 <=>.
3、爲了提高效率,通常情況下是不用子過程的。
4、$a and $b 是sort編譯所在的包的全局變量,是真實值的別名,所以一般情況下不要修改它們。
5、Example:
#!/usr/bin/perl

use strict;
use warnings;

my %ha;
$ha{1} = 7;
$ha{2} = 11;
$ha{3} = 13;
$ha{4} = 12;
$ha{5} = 23;
$ha{6} = 2;
$ha{11} = 32;
$ha{10} = 9;

my @k = keys %ha;
my @v = values %ha;

sub bykey { $a <=> $b }
sub byvalue { $ha{$a} <=> $ha{$b} }

##對數組的值進行排序
foreach my $c ( sort bykey @k ) {
        print "$c => $ha{$c}\n";
}
1 => 7
2 => 11
3 => 13
4 => 12
5 => 23
6 => 2
10 => 9
11 => 32
##sort的操作的對象是列表,處理散列其實首先是轉換爲列表形式,結果同上。
foreach my $k ( sort bykey keys %ha ) {
        print "$k => $ha{$k}\n";
}

###對數組進行排序
foreach my $c ( sort byvalue @k ) {
        print "$c => $ha{$c}\n";
}
6 => 2
1 => 7
10 => 9
2 => 11
4 => 12
3 => 13
5 => 23
11 => 32
###這裏的value的子過程還是比較能說明問題的,其實就是輸入兩個key的值,轉換爲value,之後再對value的值進行排序,裏面的別名現在已然不是$a or $b,結果同上。
foreach my $k ( sort byvalue keys %ha ) {
        print "$k => $ha{$k}\n";
}

######################
#sort排序的基本用法還是很簡單的,但是後面的比較複雜的數據結構進行排序的時候,還是有點麻煩的,懶得看了,不好意思,就先這樣吧。
發佈了59 篇原創文章 · 獲贊 31 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章