这篇文章主要介绍了Perl基本数组排序方法介绍,本文讲解基于ASCII码排序、比较函数、按字母顺序排列、Perl对数值排序等内容

本文我们学习如何用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基本数组排序方法介绍相关推荐

  1. C#对象数组排序方法

    一个排序的类,用了几种方式实现的. using System;    namespace DataStruct {    public class Sorter    { /// <summar ...

  2. 数组排序方法及C实现的总结

    1.问题描述 数组排序(即按某种特定的顺序排列数据,如升序或降序)是最重要的计算应用之一,银行用帐号对所有的支票进行能够排序,并根据排序结果准备月底的财务报告,学校学生成绩管理系统用数组排序的方法将考 ...

  3. CSharpGL(36)通用的非托管数组排序方法

    CSharpGL(36)通用的非托管数组排序方法 如果OpenGL要渲染半透明物体,一个方法是根据顶点到窗口的距离排序,按照从远到近的顺序依次渲染.所以本篇介绍对 UnmanagedArray< ...

  4. macbook android 热点,Mac_mac如何做热点?mac创建wifi热点方法介绍,  如果是家里有路由器的, - phpStudy...

    mac如何做热点?mac创建wifi热点方法介绍 如果是家里有路由器的,那热点设置就非常的简单了,那要是在特殊情况下,没有热点怎么办呢,不要着急,有一种方法可以用Mac做热点,接下来请仔细阅读教程. ...

  5. 网页如何打开php文件怎么打开,PHP文件怎么打开?打开PHP文件方法介绍

    下载站中的下载连接其实是php脚本文件控制的,有的不支持一些下载工具下载,防止大量占用网站服务器资源,当使用讯雷下载的连接就会失效,也可能是服务器链节地址失效,导致下载到的东西只是也个php脚本文件, ...

  6. android 充电监听,Android_Android判断和监听底座状态和类型的方法介绍,底座的状态跟充电状态类似, - phpStudy...

    Android判断和监听底座状态和类型的方法介绍 底座的状态跟充电状态类似,很多底座提供充电功能(座充). 底座状态同样使用sticky Intent广播.可以查询设备是否插入底座,哪种底座. 判断当 ...

  7. php 数组索引重新排序,PHP索引数组排序方法整理

    这篇文章主要介绍了关于PHP索引数组排序方法整理,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 一.冒泡排序 1. 原理 每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面,逐 ...

  8. php数组排序的方法有哪些,PHP常见数组排序方法有哪些

    PHP常见数组排序方法有哪些 发布时间:2020-12-16 10:43:23 来源:亿速云 阅读:98 作者:小新 这篇文章主要介绍PHP常见数组排序方法有哪些,文中介绍的非常详细,具有一定的参考价 ...

  9. webview 加载php页面内容,WebView加载优化的方法介绍

    本篇文章给大家带来的内容是关于WebView加载优化的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. WebView加载优化 当WebView的使用频率变得频繁的时候,对于其 ...

最新文章

  1. 邬贺铨院士:认识工业互联网
  2. Linux内核调试 - 一般人儿我都不告诉他(一)【转】
  3. 人人都会设计模式:03-策略模式--Strategy
  4. javascript基础修炼(4)——UMD规范的代码推演
  5. leetcode 142 --- linked-list-cycle-ii
  6. 绝,Java 中创建对象的 5 种方法!
  7. 需要写的一些pycoe
  8. android游戏模式,注重游戏体验 Android 12提供原生游戏模式
  9. Dubbo项目基本业务基础构建
  10. php mencache扩展,【memcache缓存专题(3)】PHP-memcache扩展的安装以及使用
  11. Java 输入一个整数,计算它各位上数字的和。(注意:是任意位的整数)
  12. linux gns3使用教程,Linux下GNS3报错解决方法
  13. CDlinux制作U盘启动盘,打造自己的口袋系统
  14. 3个文件,不到400行代码打造经典吃豆人小游戏
  15. 动态修改spine动画渲染层次
  16. Google账户二次验证取消
  17. 倾斜摄影当中重叠度、传感器尺寸、焦距等参数问题梳理
  18. 创客必备!树莓派知识大扫盲
  19. 实战:使用Pytorch搭建分类网络(肺结节假阳性剔除)
  20. Windows 10 (Win10) 将绿色免安装软件,添加到动态磁贴

热门文章

  1. Android修行手册-Button实现点击音效有多简单?
  2. 分享一个可以加速github下载的网址
  3. Android 图片四周渐变透明
  4. 李俊峰 不能搞新能源 人民战争
  5. 模拟token访问网络共享路径下的文件
  6. 二手交易小程序毕业设计,二手物品交易小程序系统设计与实现
  7. WIN7增加快捷方式小箭头
  8. [siggraph19]《荒野大镖客2》的大气云雾技术(1/4)
  9. dell t40 固态系统盘_固态攻坚战——戴尔 DELL N4050升级固态硬盘教程
  10. RabbitMQ消息持久化