【发布时间】:2011-04-04 05:05:21
【问题描述】:
print "@_\n";
4109 4121 6823 12967 12971 14003 20186
如何在 Perl 中对其进行排序?
使用@sorted = sort(@_); 给我一个字母顺序:
13041 13045 14003 20186 4109 4121 6823
如何获得数字排序? Perl 是否有用于合并排序、插入排序等的内置函数?
【问题讨论】:
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;
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 }
【讨论】:
{ $a <=> $b }? anonymous function?也许在你的回答中详细说明一下。
您可以预定义一个函数,用于计算数组中的值。
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;
现在你试一试,你得到一个错误:“不能在排序比较中使用“my $a””! (这是因为您已经使用 'strict.pm' 声明了 '$a')。但是,您也不能使用未声明的变量,因为它们将被拒绝为未定义!因此,您可能会陷入僵局。
perldoc.perl.org 和大多数其他地方都没有提到 '$a' 和 '$b' 保留(令牌)用于此用途! (当然,当一个人使用 'strict' 时,应该使用哪个。这很疯狂,因为 'a' 和 'b' 是编程中最常见的短变量之一,而且在逻辑上也是如此!)
【讨论】: