Perl 哈希的排序

一、按照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的成分比较复杂(数字+字符串)的情况

keyvalue
数字\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]对数组的引用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值