说起Perl的Sort,自然会想到她的精巧,第一次体会到Perl的魅力就是看到她的精巧。
首先说明下sort的一些注意点,默认以UTF-8方式排序,默认的两个操作符是$a 与 $b
下面,就从最简单的sort形式讲起,
my @sortted_list = sort {$a <=> $b}@list
my @sortted_list = sort {$a cmp $b}@list
对于Perl的排序中的{$a <=> $b},就相当于比较的子函数,它在排序的过程中会不断调用这个子函数来得出比较结果。相信大家用过C的sort函数时知道它有回调函数的参数的吧?
然后,还可以对参数进一步操作,比如,我可以进行大小写无关的排序
my @sortted_list = sort {lc $a cmp lc $b}@list
还可以对哈希数组排序
sort {$hash{$a} <=> $hash{$b}}keys %hash
比如下面这段:
my @x = qw(a a b a b c); my @y = qw(a b c d e f); my @z = sort{ $x[$a] cmp $x[$b] or $y[$a] cmp $y[$b] }0..$#x;
就表示先按x排序,然后按y排序,其中$#x表示@x的长度
然后,来就说下高级排序:
首先,我有这样的数据:
n多行,每一行的数据以:作为分隔符,有两个分隔符,相当于每行有3个字段
以第三个字段排序
然后最简单的做法:
my sortted_list = sort{(split /:/ , $a)[2] <=> (split /:/)[2] , $b }@list;
my %lines = map{$_,(split /:/)[2]}@list; my sortted_list = sort{$lines{$a} <=> $lines{$b}}keys %lines;
先了解下这个操作符: "||=",联系下“+=”这些操作符号就不难理解了,对于$a ||= $b来说,就相当于$a = $a || $b,解释就是$a 没有定义的话就将$b的值赋给$a
于是,利用这个特性,我们就可以写出更酷的语句:
my %hash; my sortted_list = sort{$hash{$a} ||= (split /:/ , $a)[2] <=> $hash{$a} ||= (split /:/)[2] , $b }@list;
还有更精简的做法:
my @sortted_list = map{$_->[0]} sort{$a->[1] <=> $b->[1]} map{[$_,(split /:/)[2]}@list;
它也有个专门的名字,施瓦辛格变换,这个那个电影明星应该没关系。。。
好了,就到这里,体会Perl的精妙吧!