Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5277514
  • 博文数量: 1144
  • 博客积分: 11974
  • 博客等级: 上将
  • 技术积分: 12312
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-13 20:06
文章存档

2017年(2)

2016年(14)

2015年(10)

2014年(28)

2013年(23)

2012年(29)

2011年(53)

2010年(86)

2009年(83)

2008年(43)

2007年(153)

2006年(575)

2005年(45)

分类: LINUX

2010-12-30 08:54:00

Perl 的高级排序手段
== Perl 的高级排序手段
语法:
my @sorted_array = sort  sub_sort_method  @original_array;
这里的 sub_sort_method 就是我们制定的排序策略,一般是一个sub routine 的名字,或者其代码。
示例:
my @result = sort by_number @some_numbers;  # sub by_number {$a <=> $b}
my @result = sort { $a <=> $b} @some_numbers;  # <=> 符号表示数字的比较和排序
my @descending = reverse sort { $a <=> $b} @some_numbers;
my @string = sort {$a cmp $b} @any_strings;  # cmp 表示字符串的比较和排序
my @string = sort {"\L$a" cmp "\L$b"} @any_strings;  # \L表示忽略大小写
Perl排序的理念是:你只要告诉他两个元素的比较关系(用-1,0,1表示),Perl就会为你完成任意长度的比较。
比如 {$a <=> $b} 其实表示的是
  if ($a < $b) {-1} elsif ($a > $b) {1} else {0}
<=>符号只是一个缩写。Perl只要知道我们的sort类型,就会为任意多个元素完成排序。

== 根据value对hash表的key值进行排序
首先,要理解我们无法对hash表进行排序,不然就不叫hash了。
不过,根据hash表的value我们可以为相应的key实现排序。示例如下
sub by_score {$score{$b} <=> $score{$a}};  # $b在前面是因为我们要从大到小降序排列
my %score = ('barney" => 195, "fred" => 205, "dino" => 30);
my @ranking = sort by_score keys %score;  # 注意要这样阅读 sort by_score (keys %score)
注意,by_score不是对key直接做比较,而是根据key比较value,然后反过来对key进行排序。通俗的例子就是张三和李四光凭名字无法排序,但是根据名字,我们找到他们的考试成绩,然后反过来,对名字进行排序。这就是  {$score{$b} <=> $score{$a}} 的工作。

== 二重排序与多重排序
前面的例子中,按照value进行了排名,但是如果value相同怎么办?如果我们希望对value相同的人按照字母顺序再细排,该怎么做呢?答案如下
sub by_score_and_name {
  {$score{$b} <=> $score{$a}}  # 按照value对key做降序排列
  or
  $a cmp $b # 按照字母顺序再排序
}
其实意思也很好理解。因为value相同,因此比较结果返回0,这个时候结果就由 or 的另一部分来决定了。
上面的例子是二重排序。同理可以推导多重排序的方法。
阅读(1626) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~