2010-08-26 75 views
19
print "@_\n"; 
4109 4121 6823 12967 12971 14003 20186 

如何在Perl中对它进行排序?如何在Perl中对数字进行排序?

使用@sorted = sort(@_);给了我一个字母排序

13041 13045 14003 20186 4109 4121 6823 

我如何获得一个数字排序? Perl是否具有合并排序,插入排序等内置函数?

+0

顺便说一句,你知道perldoc命令吗? – 2010-08-26 10:57:01

+0

@eugene y:不,我没有。我现在知道了。谢谢! – Lazer 2010-08-26 11:01:27

回答

42

您可以将自定义比较函数传递给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章(买的书 - 这是值得的)

+1

我会把这个链接下来,它没有持有人的同意分发版权材料。您可以推荐原作(Perl Cookbook,Christiansen和Torkington)。 – 2010-08-26 15:33:26

+0

这似乎是[Perl]标签上的一个共识,即链接到O'Reilly书籍(或任何书籍)的盗版副本是坏的。编辑删除 – DVK 2010-08-26 17:36:16

+0

对不起,没有意识到链接是盗版材料。感谢您修复它。 – sleske 2010-08-26 23:59:47

2

您可以预先定义应该用于比较数组中数值的函数。 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

默认情况下,Perl的sort按ASCII码顺序按字母顺序排序。要排序数字,您可以使用:

@sorted = sort { $a <=> $b } @_; 
+0

这是如何工作的? – Lazer 2010-08-26 10:53:35

+0

@拉泽尔:看我的解释(我提交了同样的答案,稍后;-))。 – sleske 2010-08-26 10:55:25

8

供应比较功能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)。上面使用的<=>是数值比较运算符。

4
@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 }

0

我只是想救的人,新的在Perl(像我)了很多时间谁拥有这个问题,即如何排序数字数组,因为我不仅失去了时间,而且让我疯狂!

所以,你在这里找到(在很多其他地方),要排序数字数组的方式是:

@sorted_array = sort { $a <=> $b } @unsorted_array; 

现在你试试吧,你会得到一个错误:“不能使用“我的$ a”进行排序比较“! (这是因为您已经使用'strict.pm'声明'$ a')。但是,那么你不能使用非声明变量,因为它们将被拒绝为undefined!所以,你可能会像我一样陷入僵局。

我不得不解决这个问题“困难的方式”,因为没有人关心 - 无论是在这里,还是在perldoc.perl.org,或在我访问的任何其他地方 - 提及'$ 'AND'$ b'为此使用保留(代币)! (这当然是当用'严格',哪一个应该,哪一个很疯狂,因为'a'和'b'是编程中使用的最常见的短变量,并且在逻辑上是这样的)

I希望这会对很多程序员有帮助,这些程序员都是Perl中的新成员,他们将访问此页面!