利用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进行处理,并根据需要利用<=>运算符返回结果。