+ -
当前位置:首页 → 问答吧 → perl 自定义排序规则, 原理如何理解?

perl 自定义排序规则, 原理如何理解?

时间:2011-03-17

来源:互联网

本帖最后由 jimberg 于 2011-03-17 20:52 编辑

骆驼书入门中,关于perl高级排序章节,通过自定义sort子函数规则来实现任意的排序方式。看了好几遍,一直没有完全理解清除自定义规则中的$a,$b以及返回1,-1,0对排序的影响。  望大家指点一下,能帮我解释清其中原理:


1.比如针对数字排序时使用<=>,定义如下
   my  @result= sort  by_number @some_numbers;
   sub by_number{ $a cmp $b }

书中这样解释:“排序子程序返回一个值,表明这两个元素如何比较的。如果在最终结果中$a出现在$b之前,则其排序子程序返回-1。如果$b出现在$a之前,则返回1。如果$a和$b的顺序无关紧要,则子程序返回0。
......我们使用太空船(spaceship)符号(<=>)。这个操作符比较两个数字,按照数字将其排序,并返回-1, 0, 1。”

我不清楚的是:这个返回值怎么决定两个变量的先后位置,另外,如果写成$b cmp $a则得到与前面反序的序列, 那这个$a 和$b 应该指代的究竟是什么呢?



2.另一自定义规则(从网上搜到的一段代码)

比如说,你要把一组数安字母顺序排列,但是你要让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;

$a和 $b均和'dh'比较,为什么要使用等于eq来比较,设定的返回值为什么一个-1一个1?

作者: jimberg   发布时间: 2011-03-17

真没哪位研究过么

作者: jimberg   发布时间: 2011-03-17

$a $b 可以理解为描述排序时比较方式的 '占位符', -1 , 0 , 1 决定了排序后 $a $b 对应的值的相对位置

eq 是测试字符串是否相等

作者: zhlong8   发布时间: 2011-03-17

热门下载

更多