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?
骆驼书入门中,关于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 是测试字符串是否相等
eq 是测试字符串是否相等
作者: zhlong8 发布时间: 2011-03-17
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28