Perl数组排序学习笔记

 更新时间:2019-04-17 21:46:07   作者:佚名   我要评论(0)

本文我们学习如何用Perl对字符串或者数字数组进行排序。
Perl有个内置函数叫做sort毫无疑问的可以排序一个数组。 其最简单的形式是传递一个数组,它会返回排序

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

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

基于ASCII码排序

复制代码 代码如下:

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
 
use Data::Dumper qw(Dumper);
 
my @words = qw(foo bar zorg moo);
 
say Dumper \@words;
 
my @sorted_words = sort @words;
 
say Dumper \@sorted_words;

上边的例子将会打印
复制代码 代码如下:

$VAR1 = [
        'foo',
        'bar',
        'zorg',
        'moo'
      ];
 
$VAR1 = [
        'bar',
        'foo',
        'moo',
        'zorg'
      ];

第一个输出显示了排序前的数组,第二个是排序后的。

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

复制代码 代码如下:

my @words = qw(foo bar Zorg moo);
@sorted_names里的结果将是:

$VAR1 = [
        'Zorg',
        'bar',
        'foo',
        'moo'
      ];


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

比较函数

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

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

复制代码 代码如下:

sort { $a cmp $b } @words;

这段代码会跟没有使用块的sort @words达到同样的效果。

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

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

复制代码 代码如下:

my @sorted_words = sort { lc($a) cmp lc($b) } @words;

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

结果是

复制代码 代码如下:

$VAR1 = [
        'bar',
        'foo',
        'moo',
        'Zorg'
      ];

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

复制代码 代码如下:

my @numbers = (14, 3, 12, 2, 23);
my @sorted_numbers = sort @numbers;
say Dumper \@sorted_numbers;
$VAR1 = [
        12,
        14,
        2,
        23,
        3
      ];

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

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

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

复制代码 代码如下:

my @sorted_numbers = sort { $a <=> $b } @numbers;

结果是:

复制代码 代码如下:

$VAR1 = [
        2,
        3,
        12,
        14,
        23
      ];

您可能感兴趣的文章:

  • perl 列表和数组变量详解
  • perl常量、多维数组及变量的初始化的实例代码
  • perl去除重复内容的脚本代码(重复行+数组重复字段)

相关文章

  • Perl数组排序学习笔记

    Perl数组排序学习笔记

    本文我们学习如何用Perl对字符串或者数字数组进行排序。 Perl有个内置函数叫做sort毫无疑问的可以排序一个数组。 其最简单的形式是传递一个数组,它会返回排序
    2019-04-17
  • Perl初学笔记之Hello World

    Perl初学笔记之Hello World

    工作需要开始学Perl,下载个Window版(5.16)的: 下载链接 http://www.activestate.com/activeperl/downloads 安装好了之后,写第一个perl程序 复制代码
    2019-04-17
  • ruby ftp封装实例详解

    ruby ftp封装实例详解

    ruby ftp封装实例详解 最近自己用ruby 封装了一个Net::FTP的工具类. class FtpTool def initialize() @current_ftp = create_ftp end #
    2019-04-17
  • ruby中并发并行与全局锁详解

    ruby中并发并行与全局锁详解

    前言 本文主要给大家介绍了关于ruby并发并行和全局锁的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 并发和并行 在开发时
    2019-04-17
  • Perl图形化包管理工具PPM学习使用笔记

    Perl图形化包管理工具PPM学习使用笔记

    PPM(Programmer's Package Manager)是ActivePerl自带的一个图形化管理工具,有了这个工具,要升级,更新,移除Perl的Package都非常方便。只需要输入ppm 或者
    2019-04-17
  • Ruby 中的 module_function 和 extend self异同

    Ruby 中的 module_function 和 extend self异同

    在阅读开源的 Ruby 代码和编写可维护性的代码经常遇到这两者的使用,那么他们两者的共同点和区别是什么呢? module_function Ruby 的 module 是 method 和 co
    2019-04-17
  • Redis集群搭建全记录

    Redis集群搭建全记录

    Redis集群是一个提供在多个Redis节点间共享数据的程序集。   Redis集群中不支持处理多个keys的命令。   Redis集群通过分区来提供一定程度的可用性。在某个
    2019-04-17
  • 使用RVM实现控制切换Ruby/Rails版本

    使用RVM实现控制切换Ruby/Rails版本

    在学习Ruby on Rails的过程中,不同教程使用的Ruby和Rails版本不一样,为了保持和教程中使用的版本一致,我们可以用RVM(Ruby Version Manager)来控制当前的
    2019-04-17
  • mac及linux下搭建ruby+rails环境

    mac及linux下搭建ruby+rails环境

    mac通常会自带ruby一个版本的ruby环境, 比如我的是2.0.0。 如果项目需要的版本巧好和自己的默认版本一样,就不用折腾安装其他版本了。 如果不一样, 这里介
    2019-04-17
  • ruby on rails中Model的关联详解

    ruby on rails中Model的关联详解

    前言: 在学习model关联之前,首先要牢记一下几点: 1.关联关系,两端都要写好,否则会出现初学者看不懂的错误。而且对于理解代码,非常有好处。 2.mod
    2019-04-17

最新评论