在用array跟hash的時候,有可能塞入各種不同的資料,而我們可能會需要針對array跟hash做排序的動作,在此就說明一些Perl有關排序的寫法。
假設你宣告一個array,裡面分別有1, 123, 12, 25, 2。
my @array = (1, 123, 12, 25, 2);
這時候我們可以利用sort來作排序。
print sort @array;
你認為會有怎樣的結果?你可能會認為@array會被排序成按數字大小排序的”1, 2, 12, 25, 123”,但是實際上結果會是”1, 12, 123, 2, 25”,這是因為sort在Perl裡面所預設的排序法是字典排序法(lexicographic order)。
那要怎樣才能做numeric order呢?Perl提供了靈活的方式,讓你可以自訂各種不同狀況的排序法。
# 字典排序
@sorted = sort @not_sorted;
@sorted = sort {$a cmp $b} @not_sorted;
# 反向排序
@sorted = reverse sort @not_sorted;
@sorted = sort {$b cmp $a} @not_sorted;
# 數字排序
@sorted = sort {$a <=> $b} @not_sorted;
# case-insensitive排序
@sorted = sort {lc $a cmp lc $b} @not_sorted;
# 字串長度排序
@sorted = sort {length $a <=> length $b} @not_sorted;再不然你還可以將不同的排序法混著一起用。
# 先比字串長度, 再用字典法排序
@sorted = sort {length $a <=> length $b || $a cmp $b} @not_sorted;
再不然你也可以自己寫一種排序法來使用。
sub MySortingAlgorithm
{
$a =~ /^(\d+)\_.*\_([A-Za-z0-9]{2,}.*)$/;
my $a1 = $1;
my $a2 = $2;
$b =~ /^(\d+)\_.*\_([A-Za-z0-9]{2,}.*)$/;
my $b1 = $1;
my $b2 = $2;
$a1 <=> $b1 || $a2 cmp $b2
}
@sorted= sort MySortingAlgorithm @not_sorted;
如果你想排序的是一個hash,那麼你可以針對hash的key或value來作排序的動作。
# 按hash的key值排列
@sorted = sort { $a cmp $b } keys %hash; 
# 按hash的value排列
@sorted = sort { $hash{$a} cmp $hash{$b} } keys %hash; 
 
沒有留言:
張貼留言