代码改变世界

利用sort对数组进行自定义排序

2012-10-30 15:29  钱吉  阅读(1789)  评论(0编辑  收藏  举报

关于sort的常规用法这篇博文写的很具体,可以参考:

http://www.cnblogs.com/xinghua/archive/2007/02/07/643867.html

sort函数的三种形式:

sort LIST
sort BLOCK LIST
sort SUBNAME LIST

本文主要讲下自定义函数对数组进行排序,即如何实现SUBNAME函数。看下面的列子就明白了:

有一个文本,里面记录了一下内容,第一列表示文件名,第二列表示文件创建时间,如2011/9/10/12/5表示文件创建于2011年9月10日12点5分。

file1 2012/10/30/3/15
file2 2012/9/28/12/10
file3 2011/9/10/12/5
file4 2012/10/30/2/10
file5 2011/10/12/3/50
file6 2012/9/27/1/20

 

现在我们希望对文件的内容进行排序,使其按照创建时间的先后排列。下面是执行的脚本:

 1 use strict;
 2 @ARGV==2||die"usage:*.pl in out\n";
 3 my @all;
 4 open(FILE1,"$ARGV[0]")||die;
 5 open(FILE2,">$ARGV[1]")||die;
 6 @all=<FILE1>;##read the context in file
 7 chomp(@all);##delete the CR symbol
 8 foreach my $str(sort Function @all)##use Function to sort the array
 9 {
10     print FILE2 "$str\n";
11 }
12 close(FILE1);
13 close(FILE2);
14 1;
15 sub ::Function
16 {
17     my $list1 = $a;##default parameter 1
18     my $list2 = $b;##default parameter 2
19     my @arr1 = split(/\s+/,$list1);
20     @arr1 = split(/\\|\//,pop(@arr1));
21     my @arr2 = split(/\s+/,$list2);
22     @arr2 = split(/\\|\//,pop(@arr2));
23     
24     @arr1==@arr2||die"type error!\n";##judge the two array is equal or not
25     my $n = @arr1;
26     for(my $i=0; $i<$n; $i++)
27     {
28         if($arr1[$i]!=$arr2[$i])
29         {
30             return $arr1[$i]<=>$arr2[$i];
31         }
32     }
33 }

执行以后,文件内容被重排序,内容如下:

file3 2011/9/10/12/5
file5 2011/10/12/3/50
file6 2012/9/27/1/20
file2 2012/9/28/12/10
file4 2012/10/30/2/10
file1 2012/10/30/3/15

所以,自定义排序函数其实就是对默认输入的两个参数$a和$b进行处理,并根据需要利用<=>运算符返回结果。