免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1853 | 回复: 9

请教关于array of hash的排序 [复制链接]

论坛徽章:
0
发表于 2012-07-03 18:43 |显示全部楼层
Hi,

请教大家一个关于array of hash的排序:

有这样一个array:

@AoH = (
    {
       rsh => "0.4",
    },
    {
       telnet=> "0.022",
    },

    {
       ssh => "0.3",
    },
  );

我想按照value的值从小到大输出,其中 rsh, telnet, ssh 这些key的值是随机的。

output:

telnet : 0.022
ssh    : 0.3
rsh     : 0.4

谢谢!

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
发表于 2012-07-03 19:09 |显示全部楼层
  1. @res = sort { (values($a))[0] <=> (values($b))[0] } @AoH;
  2. foreach (@res) {
  3.     while (($k, $v) = each %{$_}) {
  4.         print "$k\t: $v\n";
  5.     }
  6. }
复制代码

论坛徽章:
0
发表于 2012-07-03 21:13 |显示全部楼层
回复 2# cdtits

可以解释下@res = sort { (values($a))[0] <=> (values($b))[0] } @AoH;中的<=>符号的作用吗?


   

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
发表于 2012-07-03 21:44 |显示全部楼层
回复 3# congkk


    详细信息你可以查看
  1. $ perldoc perlop
复制代码
简单来说这个 spaceship operator 是一个二元操作符,它进行数值比较操作,如果操作数 1 小于操作数 2 就返回 -1,相等返回 0,否则返回 1。sort 就是根据返回值是等于 0 还是大于 0 或者小于 0 来进行排序的。

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
发表于 2012-07-04 09:04 |显示全部楼层
  1. my @sort = map  { $_->[0] }
  2.            sort { $a->[1] <=> $b->[1] }
  3.            map  { [ $_, (%$_)[1] ] } @AoH;
复制代码

论坛徽章:
0
发表于 2012-07-04 10:24 |显示全部楼层
本帖最后由 xiyoulaoyuanjia 于 2012-07-04 10:25 编辑
  1. print $_[1] for sort { (values($a))[0] <=> (values($b))[0] } @AoH;
复制代码

论坛徽章:
0
发表于 2012-07-04 12:56 |显示全部楼层
学习了, 谢谢!

论坛徽章:
0
发表于 2012-07-04 14:26 |显示全部楼层
回复 5# yybmsrs


    这就是典型的 Schwartzian transform

论坛徽章:
0
发表于 2012-07-04 16:47 |显示全部楼层
回复 6# xiyoulaoyuanjia

6楼的貌似有问题,我改成这样就可以:
print keys($_),":",values($_),"\n" for sort { (values($a))[0] <=> (values($b))[0] } @AoH;

   

论坛徽章:
0
发表于 2012-07-05 11:33 |显示全部楼层
thanks ! you are right!.
回复 9# xmchenb


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP