一、按照hash的值(value)进行排序
按ASCII码排序
foreach my $key ( sort { $hash{$a} cmp $hash{$b} } keys %hash )
{
my $value = $hash{$key};
}
按照数字小到大排序
foreach my $key ( sort { $hash{$a} <=> $hash{$b} } keys %hash )
{
my $value = $hash{$key};
}
按照数字大到小排序
foreach my $key ( sort { $hash{$b} <=> $hash{$a} } keys %hash )
{
my $value = $hash{$key};
}
重点:1、ASCII码和数字的排列方式的区别在于cmp和<=>的使用;2、升序和降序在于$a和$b的位置区别;
二、按照hash的键(key)进行排序
1、基础情况
基本方式等同value,区别在于sort的主体内容,指代key而非键
sort {$a<=>$b}
foreach my $key (sort {$a<=>$b} keys %hash)
{
print “$key == > $hash{$key}\n”;
}
2、key的成分比较复杂(数字+字符串)的情况
| key | value |
| 数字\t字符串 | **** |
| 数字\t字符串 | ****** |
最终的输出结果形式:
希望根据key的数字部分进行排序。
查到一个有意思的写法,做一下解析
foreach my $i (
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, split /\t/, $_, -1 ] }
keys %hash)
{
print "$i\t$hash{$i}\n";
}
重点的排序部分整个的写法,去除换行符之后应该如下:
map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [ $_, split /\t/, $_, -1 ] } keys %hash
整个结果是在keys(%hash)这个数组基础上进行的排序,类似多函数的使用,解析方式应从内到外
首先
map { [ $_, split /\t/, $_, -1 ] } keys %hash)
map{} 的作用是对数组中的元素进行替换,把$_全部替换为[ $_, split /\t/, $_, -1 ]
[ $_, split /\t/, $_, -1 ] 是一个匿名存储的数组
这个匿名存储的数组,存储的内容为:$_的整体数据+拆分后的数据(制表符拆分)
示例如下:
原字符串:1 b cd
现在的匿名数组@array:
[1 b cd 1 b cd]
$array[0]=1 b cd
$array[1]=1
$array[2]=b
$array[3]=cd
接下来
sort { $a->[1] <=> $b->[1] } *****
对匿名数组的第二个位置上的数据进行引用和排序
$a->[1] #对匿名数组的第二个位置上的数据进行引用
sort { $a->[1] <=> $b->[1] } #将引用的数据按照数字从小到大排序
最后
map { $_->[0] } *****
是将$_替换回来
->[0] #对匿名数组的第一个位置上的数据进行引用
map{} #替换
总结:
1、使用中括号[ ]构建了匿名数组,同时存入拆分和没拆分的数据
2、对拆分后的数据中的数字部分进行排序
3、对$_的收尾替换回原数据
重点:中括号[ ]构建了匿名数组;->[1] 、->[0]对数组的引用

470

被折叠的 条评论
为什么被折叠?



