免费注册 查看新帖 |

Chinaunix

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

请教高手,这段perl代码该怎么解读? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-19 22:58 |只看该作者 |倒序浏览
http://stackoverflow.com/questio ... -with-tab-delimiter

#!/usr/bin/perl -w

use strict;

my $sort_field = 2;
my $split_regex = qr{\s+};

my @data;
push @data, "7 8\t 9";
push @data, "4 5\t 6";
push @data, "1 2\t 3";

(下面这段代码没太看懂,请哪位高手帮忙解读下,谢谢啦)

my @sorted_data =
    map  { $_->[1] }
    sort { $a->[0] <=> $b->[0] }
    map  { [ ( split $split_regex, $_ )[$sort_field], $_ ] }
    @data;

论坛徽章:
0
2 [报告]
发表于 2013-08-19 23:26 |只看该作者
根据每行最后一列的值按升序排序

搜施瓦茨变换

论坛徽章:
0
3 [报告]
发表于 2013-08-19 23:53 |只看该作者
回复 2# Cu_fans


cu_fans兄,
可不可以再问下,
map  { [ ( split $split_regex, $_ )[$sort_field], $_ ] }
这里的两对方括号该怎么解读?两个$_内容是一样的吗?谢谢兄。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
4 [报告]
发表于 2013-08-20 00:54 |只看该作者
alinunix兄:
  1. map { [ ( split $split_regex, $_ )[$sort_field], $_ ] } @data;
复制代码
==
  1. map  { my @s = split $split_regex, $_; [ $s[$sort_field], $_ ] } @data;
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-08-20 10:13 |只看该作者
回复 4# rubyish

rubyish兄,

写成这样,看懂了,非常感谢兄的指点:)
map  { my @s = split $split_regex, $_; [ $s[$sort_field], $_ ] } @data;

再看原来的就明白了
<1> ( split $split_regex, $_ )[$sort_field] 相当于 (@array)[$sort_field],是数组取值,$sort_field是下标
<2> [ ( split $split_regex, $_ )[$sort_field], $_ ],相当于[$a, $b],是一个匿名数组
<3>整体看

my @sorted_data =
    map  { $_->[1] }
    sort { $a->[0] <=> $b->[0] }
    map  { [ ( split $split_regex, $_ )[$sort_field], $_ ] }
    @data;

(a) map  { [ ( split $split_regex, $_ )[$sort_field], $_ ] } @data; => 取@data的最后一列和原来的数组值组成一个匿名数组,以第一个元素为例,就是[9, 7 8\t 9]
(b) sort { $a->[0] <=> $b->[0] } => 匿名数组按最后一列升序排序
[3, 1 2\t 3]
[6, 4 5\t 6]
[9, 7 8\t 9]
(c) map  { $_->[1] } => 取匿名数组的第二个元素,得到以最后一列排序的数组。
[1 2\t 3, 4 5\t 6, 7 8\t 9]



   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2013-08-20 10:23 |只看该作者
alinunix兄,讲的不错~太精彩了
3Q

论坛徽章:
0
7 [报告]
发表于 2013-08-20 10:29 |只看该作者
Cu_fans 发表于 2013-08-19 23:26
根据每行最后一列的值按升序排序

搜施瓦茨变换


Cu_fans兄,

非常感谢兄的指点。根据rubyish兄 改写的map  { my @s = split $split_regex, $_; [ $s[$sort_field], $_ ] } @data;,终于理解了原代码的含义,然后根据兄的建议搜索了施瓦茨变换,参考http://www.myexception.cn/perl-python/1025127.html,知道这段代码还可以变通,先按某一列排序,然后再按某一列继续排序。

my @sorted_data =
    map  { $_->[2] }
    sort { $a->[0] <=> $b->[0]
           or $a->[1] <=> $b->[1]
         }
    map  { my @s = split $split_regex, $_; [ $s[$sort_field], $s[$sort_field_2], $_ ] }
    @file1;

L1 999.000 940.000
L2 1159.000 940.000
L3  1319.000 5890.000
L4 999.000 790.000
L5 10000.000 8740.000
L6 10000.000 940.000
L7 1159.000 790.000
L8 1319.000 5740.000

=>

L4 999.000 790.000
L1 999.000 940.000
L7 1159.000 790.000
L2 1159.000 940.000
L8 1319.000 5740.000
L3  1319.000 5890.000
L6 10000.000 940.000
L5 10000.000 8740.000

再次感谢Cu_fans兄,又学到一样新东西:)


论坛徽章:
0
8 [报告]
发表于 2013-08-20 10:33 |只看该作者
回复 6# rubyish

rubyish兄的指点才是重点,最下面的map看懂了,其他的就简单了。


   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
9 [报告]
发表于 2013-08-20 10:42 |只看该作者
alinunix兄:
map 你可以试一下,可以省很多代码,很多很多

论坛徽章:
0
10 [报告]
发表于 2013-08-20 10:56 |只看该作者
rubyish 发表于 2013-08-20 10:42
alinunix兄:
map 你可以试一下,可以省很多代码,很多很多

的确是,以前没用过map,这段代码如果不用map的话,估计要写很长一段了。rubyish兄是高手,以后碰到问题,还请兄多指点哦:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP