Perl学习笔记之Sort
说起Perl的Sort,自然会想到她的精巧,第一次体会到Perl的魅力就是看到她的精巧。 首先说明下sort的一些注意点,默认以UTF-8方式排序,默认的两个操作符是$a 与 $b 下面,就从最简单的sort形式讲起, my @sortted_list = sort {$a <=> $b}@list 这一句就将@list按从小到大的方式排序后赋值给@sortted_list,$a和$b表示当然,这是对于数字来说,如果是字符的话,就要这样: my @sortted_list = sort {$a cmp $b}@list 用“cmp”即可 对于Perl的排序中的{$a <=> $b},就相当于比较的子函数,它在排序的过程中会不断调用这个子函数来得出比较结果。相信大家用过C的sort函数时知道它有回调函数的参数的吧? 然后,还可以对参数进一步操作,比如,我可以进行大小写无关的排序 my @sortted_list = sort {lc $a cmp lc $b}@list 其中的lc表示lower函数,即转为小写 还可以对哈希数组排序 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; 显然,效率不行,每次调用子程序的次数是n*log(n),好吧,现在加入缓存 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; 这个做法有一个专门的名称,称为 Orcish Maneuver或者,|| cache 还有更精简的做法: my @sortted_list = map{$_->[0]} sort{$a->[1] <=> $b->[1]} map{[$_,(split /:/)[2]}@list; 迷糊了吧,这句来自于3条语句,依次从下到上执行,每一句的结果都是上一句的参数 它也有个专门的名字,施瓦辛格变换,这个那个电影明星应该没关系。。。 好了,就到这里,体会Perl的精妙吧! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |