在第一部分中,我们讨论了默认的排序功能。 在第二部分中,我们将讨论可用于对数据进行排序的更高级的技术。 某些技术可能会向经验不足的Perl编码器引入不熟悉的方法或语法。 我将发布指向在线资源的链接,如有必要,您可以阅读这些资源。 有经验的perl编码人员可能不会发现本文中有任何新内容或有用之处。
简短评论在第一部分中,我向您展示了一些非常基本的语法,可用于对数据进行排序:
@sorted = sort (@array); # default lexical ascending order sort
@sorted = reverse sort @array; # default lexical sort in reverse/descending order
@sorted = sort {$a cmp $b} @array; # same as first example
@sorted = sort {$b cmp $a} @array; # same as second example
如果可以使用这些“简单”排序之一对数据进行排序,则使用它们中的任何一个都没有错。
实际上,第一个示例可能是使用perl(默认的升序词汇排序)对数据进行排序的最有效方法。
问题是数据很少格式化,因此您可以使用默认排序并获得良好的结果。
但是,当然,您可以使用perl处理数据,以将其转换为可以排序的格式。
您有两个选择:对数据进行排序时进行处理,或对数据进行排序前进行处理。
使用哪种方法取决于您的数据以及对数据进行排序所需的处理量。
只有您才能确定哪种排序方法最适合您的特定数据。
排序时处理数据
如果您没有太多的数据要排序或处理很少,这是一个不错的选择。 开始工作需要较少的计划和经验,并且通常对于大多数应用程序都足够有效。 对于第一个示例,我们将使用名称列表:
my @names = qw(Jim JANE fred Andrew Chris albert sally Martha);
要按字母顺序对它们进行排序,我们需要将它们转换为所有大写或小写字母,以避免在大写字母之前对小写字母进行词汇排序。
这是一种方法:
my @sorted = sort {lc $a cmp lc $b} @names;
我们使用代码块{}和perls lc(小写)运算符在对数据进行排序时对其进行处理。
排序列表:
阿尔伯特
安德鲁
克里斯
弗雷德
简
吉姆
玛莎
莎莉
请注意,数据未更改,仅更改了顺序。 它仍然是大小写混合的相同格式。 数据仅在排序比较期间分配给$ a或$ b并转换为小写。 这意味着在排序过程中,某些数据将多次转换为小写字符。 如果处理速度很慢,这可能会对排序数据花费多长时间产生重大影响。 在此示例中,就整体性能而言,使用lc运算符是微不足道的。 即使它是一百万个名字的列表,它也应该可以快速运行。 但是,如果您需要使用正则表达式或按不同字段进行排序或对数据进行排序,则可以在进行排序之前对数据进行预处理。
另一种方法是使用子例程而不是代码块:
my @sorted = sort lowercase @names;
sub lowercase {
return lc $a cmp lc $b;
}
Perl对排序函数调用的子例程的处理不同于其他子例程。
您不会通过@_将正在排序的数据传递给子例程,perl会在内部进行此操作并将数据分配给$ a和$ b。
即使使用“ strict”编译指示,也不要用“ my”声明$ a和$ b。
它们是程序包全局变量,因此您的程序将不会抱怨需要用“ my”声明$ a和$ b。
并且不要更改或修改$ a和$ b。
它们实际上是对源数据的引用,因此更改它们可能会产生奇怪的行为。
您可以给排序子例程指定有意义的名称,以便了解其功能,即:by_age by_date by_name by_number。 通常,我发现使用代码块最简单地进行简单排序,如前面的示例,并保留使用子例程进行更复杂的排序。 假设我们有一系列的哈希值; 关键字是名字,姓氏和年龄。
my @sorted = sort by_name_and_age @array_of_hashes;
sub by_name_and_age {
return $a->{last_name} cmp $b->{last_name}
|| $a->{first_name} cmp $b->{first_name}
|| $b->{age} <=> $a->{age};
}
这里我们介绍||。
(或)运算符。
当perl对数据进行排序时,如果$ a在$ b之前,则返回-1;如果它们相同,则返回0;如果$ a在$ b之后,则返回1。
如果任何比较返回0,则由于||,perl转到下一个比较。
操作员。
如果比较返回-1或1,则perl停止比较。
如果所有比较均返回0,则将首先列出所评估数据的第一位。
请注意,年龄键是按降序排列的。
您可以将升序和降序比较以相同的方式混合使用。
如果名字和姓氏相同,则最老的人将首先列出。
如果您不熟悉上一个示例中假设的复杂数据(散列数组),那么这里是指向perldoc网站上的教程的链接: 复杂数据结构 。
使用Perl进行数据排序的第三部分将讨论处理后的排序方法。
本文受《
创用CC许可 。From: https://bytes.com/topic/perl/insights/753554-sorting-data-perl-part-two