免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1972 | 回复: 5
打印 上一主题 下一主题

关于perl 散列hash 的分类排序问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-18 05:34 |只看该作者 |倒序浏览
各位好!
  perl 新手,遇到个问题无法解决, 求助
我想把以下哈希表中的 key进行分类,values 经过排序,然后读出  
  %hash = (
                  "17"  => "7258",
                   "05"  => "25508",
                  "17" =>  "7873",
                  "05"  => "7258",
                  "17" => "6611",
                  "05" => "9166",
);

比如,最终输出结果为
05 => 7258
05 => 9166
05 => 25508
17 => 6611
17 => 7258
17 => 7873

论坛徽章:
0
2 [报告]
发表于 2012-03-18 09:34 |只看该作者
首先hash键是唯一的,所以前面的%hash定义有问题

  1. foreach $key(sort keys(%hash))
  2. {
  3.     print "$key=>$hash{$key}\n";
  4. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-03-18 10:22 |只看该作者

回复 2# llbgurs

  我没讲清楚,其实我的需求是,想从日志将17,15 分类输出。而且还要对17所对应的 ID 进行排序。
   17 to 7258,
    05  to 25508,
    17 to  7873,
    05  to 7258,
    17 to 6611",
    05 to 9166,
最终的输出结果为就可以了。
05 => 7258
05 => 9166
05 => 25508
17 => 6611
17 => 7258
17 => 7873

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2012-03-19 09:52 |只看该作者
回复 3# xiaoao7678


$ cat sort_val2.pl
  1. #! /usr/bin/env perl
  2. use strict;
  3. use warnings;

  4. my @data = <DATA>;
  5. my @sort_data = map { $_->[1]. " => " . $_->[2] . "\n"}
  6.                 sort {($a->[1] <=> $b->[1]) or ($a->[2] <=> $b->[2])}
  7.                 map {[$_, m/^\s+(\d+)\s+to\s+(\d+)/]} @data;
  8. print @sort_data;

  9. __DATA__
  10.    17 to 7258,
  11.     05  to 25508,
  12.     17 to  7873,
  13.     05  to 7258,
  14.     17 to 6611",
  15.     05 to 9166,
复制代码
$ perl sort_val2.pl
05 => 7258
05 => 9166
05 => 25508
17 => 6611
17 => 7258
17 => 7873
   

论坛徽章:
0
5 [报告]
发表于 2012-07-07 18:17 |只看该作者
回复 4# jason680


    工作忙,不常来这。非常谢谢你的回复。有机会加你QQ,跟你学习下perl

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
6 [报告]
发表于 2012-07-07 20:04 |只看该作者
  1. #!/usr/bin/env perl

  2. @res =  sort { $a->[0] <=> $b->[0] or $a->[1] <=> $b->[1];  }
  3.         map  { /(\d+)\s+\w+\s+(\d+)/; [$1, $2];             } <DATA>;
  4. print "$_->[0] => $_->[1]\n" for (@res);

  5. __DATA__
  6. 17 to 7258,
  7. 05  to 25508,
  8. 17 to  7873,
  9. 05  to 7258,
  10. 17 to 6611",
  11. 05 to 9166
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP