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

时间:2010-08-26 10:47:39

标签: arrays perl sorting

print "@_\n";
4109 4121 6823 12967 12971 14003 20186

如何在Perl中对其进行排序?

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

13041 13045 14003 20186 4109 4121 6823

如何获得数字排序? Perl是否具有用于合并排序,插入排序等的内置函数?

7 个答案:

答案 0 :(得分:48)

您可以将自定义比较函数传递给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 :(得分:9)

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:6)

这是一个Perl常见问题解答。从命令行:

perldoc -q sort

perlfaq4: How do I sort an array by (anything)?

答案 4 :(得分: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 }

答案 5 :(得分: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;

答案 6 :(得分:0)

我只想为任何人提供大量时间,Perl(像我这样)有这个问题的新人,即如何对数字数组进行排序,因为我不仅浪费时间而且让我疯狂! / p>

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

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

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

我必须“艰难地”解决这个问题,因为没有人关心 - 无论是在这里,还是在perldoc.perl.org,或者在我访问的任何其他地方 - 提到'$ a 'AND'$ b'为此使用保留(令牌)! (这当然是当一个人使用'严格'时,哪一个应该。而且这是非常疯狂的,因为'a'和'b'是编程中使用的最常见的短变量之一,而且逻辑上如此!)

我希望这会对很多程序员有所帮助,Perl的新人将访问此页面!