Perl中如何对数字进行排序
Posted
技术标签:
【中文标题】Perl中如何对数字进行排序【英文标题】:How to sort numbers in Perl 【发布时间】: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 是否有用于合并排序、插入排序等的内置函数?
【问题讨论】:
【参考方案1】:您可以将自定义比较函数传递给 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章(买书——值得!)
【讨论】:
我会删除该链接,它未经所有者同意就分发受版权保护的材料。您可以推荐原始作品(Perl Cookbook、Christiansen 和 Torkington)。 似乎对 [Perl] 标签的共识是,链接到 O'Reilly 书籍(或任何书籍)的盗版副本是不好的。编辑删除 对不起,没有意识到链接是盗版材料。感谢您修复它。 Google 图书通常有很好的非盗版材料适合链接。【参考方案2】:为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)
。上面使用的<=>
是数值比较运算符。
【讨论】:
【参考方案3】:默认情况下,Perl 的 sort
按 ASCII 字母顺序排序。要按数字排序,您可以使用:
@sorted = sort $a <=> $b @_;
【讨论】:
@Lazer:查看我的解释(我提交了相同的答案,只是稍晚一点;-))。【参考方案4】:这是一个 Perl 常见问题解答。从命令行:
perldoc -q sort
perlfaq4: How do I sort an array by (anything)?
【讨论】:
【参考方案5】:@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?也许在你的回答中详细说明一下。
对不起,我忘记了我曾经知道的关于 perl 的一切。好像叫做“block”,a/b变量是sort在使用block时提供的“package global”变量。【参考方案6】:
您可以预定义一个函数,用于计算数组中的值。
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;
【讨论】:
【参考方案7】:您在这里(以及许多其他地方)发现对数值数组进行排序的方法是:
@sorted_array = sort $a <=> $b @unsorted_array;
现在你试一试,你得到一个错误:“不能在排序比较中使用“my $a””! (这是因为您已经使用 'strict.pm' 声明了 '$a')。但是,您也不能使用未声明的变量,因为它们将被拒绝为未定义!因此,您可能会陷入僵局。
perldoc.perl.org 和大多数其他地方都没有提到 '$a' 和 '$b' 保留(令牌)用于此用途! (当然,当一个人使用 'strict' 时,应该使用哪个。这很疯狂,因为 'a' 和 'b' 是编程中最常见的短变量之一,而且在逻辑上也是如此!)
【讨论】:
以上是关于Perl中如何对数字进行排序的主要内容,如果未能解决你的问题,请参考以下文章