print "@_\n";
4109 4121 6823 12967 12971 14003 20186
我该如何在Perl中对其进行排序?
使用@sorted = sort(@_);
会按字母顺序排序:
13041 13045 14003 20186 4109 4121 6823
我该如何进行数字排序?Perl 是否有内置的归并排序、插入排序等函数?
你可以向 Perl 的排序程序传递自定义的比较函数。只需使用:
@sorted = sort { $a <=> $b } @unsorted;
< p > sort
函数接受一个自定义比较函数作为其第一个参数,形式为代码块。 {...}
部分只是这个代码块(参见http://perldoc.perl.org/functions/sort.html)。
sort
会在需要比较要排序的数组中的两个元素时调用此自定义比较函数。 sort
始终将要比较的两个值传递为$a
,$b
,并且比较函数必须返回比较结果。 在这种情况下,它只使用数字比较运算符(请参见http://perldoc.perl.org/perlop.html#Equality-Operators),这可能是为了这个目的而创建的:-)。
解决方案无耻地从“Perl Cookbook”,第04章子章节15中窃取(购买这本书-它很值得!)
给 sort()
函数提供一个比较函数:
# sort numerically ascending
my @articles = sort {$a <=> $b} @files;
# sort numerically descending
my @articles = sort {$b <=> $a} @files;
默认排序函数是cmp
,它进行字符串比较,会将(1, 2, 10)
排列成(1, 10, 2)
。<=>
是数值比较运算符,如上所示。
Perl的sort
默认按ASCII顺序进行字母排序。若要按数字排序,可以使用以下方法:
@sorted = sort { $a <=> $b } @_;
@l = (4109, 4121, 6823, 12967, 12971, 14003, 20186, 1, 3, 4);
@l = sort { $a <=> $b } @l;
print "@l\n"; # 1 3 4 4109 4121 6823 12967 12971 14003 20186
你需要提供自己的排序子程序 { $a <=> $b }
。
perldoc -f sort
给出了一个示例:# Sort using explicit subroutine name
sub byage {
$age{$a} <=> $age{$b}; # Presuming numeric
}
@sortedclass = sort byage @class;
<=>
运算符用于数字排序。@sorted = sort {$a <=> $b} @unsorted;
@sorted_array = sort { $a <=> $b } @unsorted_array;