perl-数组排序

刚开始看这个的时候也是看到有点懵

sort()

数组排序使用sort函数,默认为升序。三种语法

1
2
3
sort list						#字符排序
sort block list #数字排序
sort subroutine_name list #复杂多排

字符排序

默认排序为按照字符来排的

1
2
3
@array = qw/i have a dream hehe/
sort @array #升序
sort{$a cmp $b} @array #降序

这里使用到了字符串比较cmp,下面数字则使用数字比较<=>

数字排序

但是数字却不能这么写,不然排的不对

1
2
@array = qw/4 2 12 3 1 5 5 78/
sort{$a <=> $b} @array
  1. $a,$b为perl提供的package variable,是默认的,不能修改。他们两的顺序代表这不同的排序方式。

    1
    2
    sort{$a <=> $b} @array	#升序
    sort{$b <=> $a} @array #降序
  2. 当然降序还可以使用reverse()函数,对于数据量小的还行,但是如果数据量太大效率就不高,因为已经按照升序排了一次,reverse之后又要全部逆序排列一次。所以为何不使用上面的逆序一次性就排好呢

    1
    reverse sort{$a <=> $b} @array

复杂多排

前面说的都是一维数组的排序方式,如果像oracle中一样有几列数据需要排序呢

如果有三列数据,先按第一列price升序排,然后按照第三列的折扣逆序排

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
my @products = (
{
name => 'iPhone',
price => 600,
discount => 0.5,
},
{
name => 'Nexus',
price => 299,
discount => 0.1,
},
{
name => 'Samsung Galaxy',
price => 600,
discount => 0.8,
}
);

@products = sort {
$a->{price} <=> $b->{price} ||
$b->{discount} <=> $a->{discount}
} @products;

||的作用是:如果前面没有相同的数据,那么不执行后面的,如果前面有相同数据,那么就执行后面的排序