您的位置:首页 > 其它

数组和哈希的数值排序问题(sort)

2012-12-08 14:39 295 查看
在perl中对数组或者散列进行排序的工具是sort,在这儿,一般分为两种,字符串和数值(阿拉伯数字)排序问题,sort默认的情况是使用Ascall码排序。
1、sort format
>> sort USERSUB LIST
>> sort BLOCK LIST
>> sort LIST
在此,LIST其实就是一个列表,比如一个数组,或者散列使用keys进行转换。
缺省USERSUB或BLOCK时,默认的是标准字符串比较顺序排序(未定义数值排在已定义空字符串前面,而空字符串又在其他任何东西前面)。如果use locale用法起作用,那么sort LIST根据当前的区域集的数值对lIST进行排序。
2、一般情况下,字符之间的比较用cmp,数值比较用 <=>.
3、为了提高效率,通常情况下是不用子过程的。
4、$a and $b 是sort编译所在的包的全局变量,是真实值的别名,所以一般情况下不要修改它们。
5、Example:

#!/usr/bin/perl

use strict;
use warnings;

my %ha;
$ha{1} = 7;
$ha{2} = 11;
$ha{3} = 13;
$ha{4} = 12;
$ha{5} = 23;
$ha{6} = 2;
$ha{11} = 32;
$ha{10} = 9;

my @k = keys %ha;

my @v = values %ha;

sub bykey { $a <=> $b }
sub byvalue { $ha{$a} <=> $ha{$b} }

##对数组的值进行排序
foreach my $c ( sort bykey @k ) {
print "$c => $ha{$c}\n";
}

1 => 7

2 => 11
3 => 13
4 => 12
5 => 23
6 => 2
10 => 9
11 => 32

##sort的操作的对象是列表,处理散列其实首先是转换为列表形式,结果同上。

foreach my $k ( sort bykey keys %ha ) {
print "$k => $ha{$k}\n";
}

###对数组进行排序
foreach my $c ( sort byvalue @k ) {

print "$c => $ha{$c}\n";
}

6 => 2

1 => 7
10 => 9
2 => 11
4 => 12
3 => 13
5 => 23
11 => 32

###这里的value的子过程还是比较能说明问题的,其实就是输入两个key的值,转换为value,之后再对value的值进行排序,里面的别名现在已然不是$a or $b,结果同上。

foreach my $k ( sort byvalue keys %ha ) {
print "$k => $ha{$k}\n";
}

######################
#sort排序的基本用法还是很简单的,但是后面的比较复杂的数据结构进行排序的时候,还是有点麻烦的,懒得看了,不好意思,就先这样吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: