免费注册 查看新帖 |

Chinaunix

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

关于perl的排序(map,split) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-20 11:33 |只看该作者 |倒序浏览
网上有如下代码,但是看不懂,问题如下:
1.[(split)[0,4,1],$_]代码中,
   a. (split)?注:split用法见过split // @arr; split;/但是用()将它括起来是何意?
    b.[0,4,1]?注:如果只取0,4,1列,那么为什么最终显示出的是5列?
    c.map {[(split)[0,4,1],$_]}
        map{,},逗号两侧是什么关系?
   

月份       电话号码             市话      长途      总话费(元)
-----------------------------------------------------------------------
200809        74889999        3.0        6.6        188
200810        74885444        4.0        1.0        200
200810        74885555        0.8        5.5        120
200810        74889888        4.0        1.0        200

要求:1,按月份(从小到大)排序。
          2,按总花费(从大到小)排序。若总话费相等,则按号码(从小到大)排序
          首先,按月份排序。同时,按总花费(从大到小)排序,若总话费相等,则按号码(从小到大)排序

最佳答案:

print map {$_->[-1]}
    sort {$a->[0] <=> $b->[0] || $b->[1] <=> $a->[1] || $b->[2] <=> $a->[2]}
    map {[(split)[0,4,1],$_]} <DATA>;
__DATA__
200809        74889999        3.0        6.6        188
200810        74885444        4.0        1.0        200
200810        74885555        0.8        5.5        120
200810        74889888        4.0        1.0        200

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
2 [报告]
发表于 2010-07-20 11:57 |只看该作者
c.map {[(split)[0,4,1],$_]}
        map{,},逗号两侧是什么关系?


逗号在 [ ] 内。

论坛徽章:
0
3 [报告]
发表于 2010-07-20 12:22 |只看该作者
翻一下俺的精华帖子。

论坛徽章:
0
4 [报告]
发表于 2010-07-20 13:39 |只看该作者
楼上的谢了,但(split)?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
5 [报告]
发表于 2010-07-20 13:58 |只看该作者
回复 4# kookbook

(LIST)[LIST] 对列表使用下标(脚标)取值

split 返回列表。。。

论坛徽章:
0
6 [报告]
发表于 2010-07-20 14:09 |只看该作者
OK,谢了!

论坛徽章:
0
7 [报告]
发表于 2010-07-20 14:29 |只看该作者
map {$_->[3]}  是因为需要打印输出的位置前面已经有了3个元素,在这里可以写为@b= map {$_->[-1]},指的是从最后一个位置开始计算。

能帮忙解释一下吗?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
8 [报告]
发表于 2010-07-20 14:38 |只看该作者
  1. print map {$_->[-1]}   # 3. 取匿名数组最后一列(即每一整行)
  2.     sort {$a->[0] <=> $b->[0] || $b->[1] <=> $a->[1] || $b->[2] <=> $a->[2]} #2. 排序
  3.     map {[(split)[0,4,1],$_]} <DATA>; #1. map返回一个匿名数组(0列, 4列, 1列, 整行)
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-07-20 15:04 |只看该作者
取匿名数组最后一列=?(即每一整行)

一列怎会等于一行?

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
10 [报告]
发表于 2010-07-20 15:08 |只看该作者
回复 9# kookbook
  1. map {[(split)[0,4,1],$_]}
复制代码
里面的$_ 就是从<DATA>取出来的没有split的一行内容(就是前面说的整行),作为匿名数组的第四个成员
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP