加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl学习笔记之Sort

发布时间:2020-12-16 00:29:51 所属栏目:大数据 来源:网络整理
导读:说起Perl的Sort,自然会想到她的精巧,第一次体会到Perl的魅力就是看到她的精巧。 首先说明下sort的一些注意点,默认以 UTF-8方式排序 ,默认的两个操作符是$a 与 $b 下面,就从最 简单的sort 形式讲起, my @sortted_list = sort {$a = $b}@list 这一句就将

说起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的精妙吧!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读