加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl数组排序

发布时间:2020-12-15 23:58:52 所属栏目:大数据 来源:网络整理
导读:本文我们学习如何 用Perl对字符串或者数字数组进行排序 。 Perl有个内置函数叫做 sort 毫无疑问的可以排序一个数组。 其最简单的形式是传递一个数组,它会返回排序后的元素组成的数组。 @sorted = sort @original 。 基于ASCII码排序 #!/usr/bin/perl use st

本文我们学习如何用Perl对字符串或者数字数组进行排序

Perl有个内置函数叫做sort毫无疑问的可以排序一个数组。 其最简单的形式是传递一个数组,它会返回排序后的元素组成的数组。@sorted = sort @original

基于ASCII码排序

 
 
  1. #!/usr/bin/perl
  2. use strict;
  3. warnings;
  4. 5.010;
  5. ?
  6. Data::Dumper qw(Dumper);
  7. ?
  8. my@words =(foo bar zorg moo);
  9. ?
  10. say Dumper @words;
  11. ?
  12. @sorted_words sort @words?
  13. @sorted_words;

上边的例子将会打印

$VAR1 [

  • 'foo',
  • 'bar''zorg''moo'
  • ];
  • [
  • 'moo''zorg'
  • ];
  • 第一个输出显示了排序前的数组,第二个是排序后的。

    这是最简单的情形,但是可能未必是你想要的。 比如,如果一些单词以大写字母开头怎么办?

    foo bar Zorg moo);

    @sorted_names里的结果将是:

    'Zorg' 你会发现,以大写字母开头的单词排在了第一位。 这是因为sort默认根据ASCII码表排序,所有的大写字母都排在小写字母前边。

    比较函数

    Perl的sort的工作方式是这样的,它遍历原始数组的每两个元素;每次把左边的值放入变量$a,把右边的值放入变量$b。 然后调用比较函数。如果$a的内容应该在左边的话,“比较函数”会返回1;如果$b应该在左边的话,返回-1,两者一样的话,返回0。

    通常你看不到比较函数,sort会根据ASCII码表对值进行比较,不过如果你想的话,你可以显式的写出来:

    sort { $a cmp $b } 这段代码会跟没有使用块的sort @words达到同样的效果。

    这里你可以看到,默认perl使用cmp作为比较函数。这是因为正是cmp可以做这里边我们需要的工作。 它比较两边的字符串的值,如果左边参数“小于”右边参数,就返回1;如果左边参数“大于”右边参数,就返回-1;如果相等,就返回0。

    按字母顺序排列

    如果你想忽略字符串的大小写来排序——即通常所谓的字母序,你可以像下一个例子这么做:

    sort lc$a) cmp lc$b 这里为了比较,我们调用lc函数返回参数的小写版本。然后cmp比较这些小写版本并决定原始字符串谁先谁后。

    结果是

    'Zorg'

  • Perl对数值排序

    如果对数值数组使用sort进行默认的排序,结果可能不是我们期望的。

    @numbers(14312223);

  • @sorted_numbers@numbers @sorted_numbers3
  • 仔细一想的话,这并不奇怪。比较函数看到12和3时,它按字符串进行比较。这意味着比较两个字符串的第一个字符"1"和"3"。 在ASCII码表里,"1"在"3"前边,因此字符串"12"会排在字符串"3"前面。

    Perl不会很神奇地猜到你想按数字对这些值排序。

    尽管我们可以写一个比较函数来按数字比较两个值。但这里我们使用<=>(也被称作宇宙飞船操作符), 它会按数字来比较两个参数并返回1、-1或者0。

    $a <=> $b 结果是:

    23

  • ];
  • (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读