Perl基本数组排序方法介绍
admin
2024-03-10 05:16:07
0次

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
      ];

相关内容

热门资讯

一分钟了解!新大海互娱辅助功能... 一分钟了解!新大海互娱辅助功能软件,新大海互娱总是是有辅助软件1、新大海互娱免费脚本咨询教程、新大海...
推荐十款辅助器!捕鱼游戏辅助器... 推荐十款辅助器!捕鱼游戏辅助器多功能AIapp,捕鱼游戏好像有辅助器app1、下载好捕鱼游戏脚本下载...
一分钟揭秘外挂!小白大作战外挂... 一分钟揭秘外挂!小白大作战外挂多功能AI工具,小白大作战一直是真的有外挂工具小白大作战是不是有人用挂...
一分钟了解!新星游辅助器功能神... 一分钟了解!新星游辅助器功能神器,新星游确实真的有辅助器神器1、超多福利:超高返利,海量正版游戏,新...
一分钟了解透视器!纵横互娱透视... 一分钟了解透视器!纵横互娱透视器多功能AI脚本,纵横互娱果然是有透视器脚本纵横互娱透视方法中分为三种...
一分钟了解!欢乐五张辅助器功能... 一分钟了解!欢乐五张辅助器功能教程,欢乐五张一直有辅助器教程一、欢乐五张可以开透视的定义与意义1、欢...
总算明白外挂!牛大亨外挂多功能... 总算明白外挂!牛大亨外挂多功能AI攻略,牛大亨切实存在有外挂攻略1、在牛大亨插件功能辅助器技巧中,中...
传递经验!双喜互娱辅助器功能a... 传递经验!双喜互娱辅助器功能app,双喜互娱一直是有辅助器app1、首先打开双喜互娱辅助器下载最新版...
今日百科透视器!星际互联透视器... 今日百科透视器!星际互联透视器多功能AI方法,星际互联其实是真的有透视器方法1、每一步都需要思考,不...
今日公布!双喜互娱辅助器功能a... 今日公布!双喜互娱辅助器功能app,双喜互娱原来有辅助器app双喜互娱是不是有人用挂微扑克wpk插件...