• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

perl的排序问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Perl自带有排序函数sortsort的用法主要有两种:

for my $id (sort {$a <=> $b}keys %hash){

}###这样写可以先对%hash里的keys值按数字排序后依次提取出来

1. 直接使用

@articles = sort @files;

上述例子中,sort将依据标准的字符串排序法则对数组files里包含的元素进行排序。也就是说数组里定义的数字或者字母将被转换成ASCII码后进行排序。

2.自定义排序法则

@articles = sort {sub rule} @files;

上述例子中的"sub rule"指的是自定义排序法则的子程序(subroutine)。

在介绍自定义排序法则的子程序之前,让我们先来看看perl里的比较符(comparison operators)

  • 数字比较符: <, >, <=, >=, ==, <=>
  • 字符串比较符:lt, gt, le, gr, eq, cmp

前面几个很容易懂,最后一个"<=>"或者"cmp"是用来比较两个数字或者字符串之间的关系。

$a 和 $b 之间的关系 $a <=> $b 的返回值
$a 大于$b 1
$a 等于$b 0
$a 小于$b -1

因此,常用的自定义排序法则的子程序可以这样写:

#数字比较
@sorted = sort { $a <=> $b } @not_sorted 
#字母比较1
@sorted = sort { $a cmp $b } @not_sorted
#字母比较2, 先转换成小写比较
@sorted = sort { lc($a) cmp lc($b) } @not_sorted

这里的$a 和$b其实是perl固有的全局变量(build-in/package globals) , 我们把自定义排序法则的子程序写成: {$a <=>$b} ,perl编译器将得知你定义了的排序法则是采用数字比较大小。我们在对hash按key进行排序时候常用到自定义排序法。例如:

foreach(sort{$mapword{$b}<=>$mapword{$a}}keys %mapword){
print "$_$mapword{$_}\n";
} 
#1. 'keys % mapword' 得到的是一个数组
#2. 用全局变量,$a, $b定义了对比法则,将对%mapword的key数值按从小到大顺序排列
#3. 打印出$key值和对应的hash值

既然是自定义法则,你还可以把比较法则定义成你自己想要的,比如说,你要把一组数安字母顺序排列,但是你要让dh永远排在前面,你可以这么写:

@words = ("hi", "da", "abc", "dh", "man");
@sorted = sort { 
                 if ($a eq 'dh') { return -1; }
                 elsif ($b eq 'dh') { return 1; } 
                 else { return $a cmp $b; } 
               } @words;
print @sorted;
#打印结果为:dhabcdahiman

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
PerlofWisdom(reship)发布时间:2022-07-22
下一篇:
Linux下Perl的安装(转) 原文地址:Linux下Perl的安装发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap