Perl数组排序学习笔记_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
      ];

时间: 2024-11-28 19:02:27

Perl数组排序学习笔记_perl的相关文章

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)

Perl中的控制结构学习笔记_perl

一.语句的种类 计算机是一种工具,优势在于执行重复任务.循环执行,循环语句. 需要作出大量的判断,按条件执行,条件语句. 顺序语句. 表达式真假值总结 表达式不一定是逻辑表达式,但一定要得出真假值. 假值: 逻辑值为假 值为0 字符串为空 列表为空 undef 其它情况为真值 二.条件语句if 形式 复制代码 代码如下: if(表达式){         空格忽略,断行可以不同                     if(表达式) 语句}               { elsif(表达式){

Perl中的列表和数组学习笔记_perl

一.列表 列表是包含在括号里的一序列的值,可以为任何数值,也可为空,如:(1, 5.3 , "hello" , 2),空列表:(). 注:只含有一个数值的列表(如:(43.2) )与该数值本身(即:43.2 )是不同的,但它们可以互相转化或赋值.列表例: 复制代码 代码如下:     (17, $var, "a string")     (17, 26 << 2)     (17, $var1 + $var2) ($value, "The an

Perl中的文件读写学习笔记_perl

一.打开.关闭文件 语法为open (filevar, filename),其中filevar为文件句柄,或者说是程序中用来代表某文件的代号,filename为文件名,其路径可为相对路径,亦可为绝对路径. 复制代码 代码如下:  open(FILE1,"file1");  open(FILE1, "/u/jqpublic/file1"); 打开文件时必须决定访问模式,在PERL中有三种访问模式:读.写和添加.后两种模式的区别在于写模式将原文件覆盖,原有内容丢失,形式

Perl中的子程序学习笔记_perl

一.定义 函数可分为系统函数和用户函数.子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读.PERL中,子程序可以出现在程序的任何地方.定义方法为: 复制代码 代码如下:   sub subroutine{     statements;   } 二.调用   调用方法如下: 1.用&调用 复制代码 代码如下:   &subname;   ...   sub subname{     ...   } 2.先定义后调用 ,可以省略&符号 复制代码 代码如下:

Perl函数(子程序)学习笔记_perl

一.函数定义 子程序即一段分离的代码,它可以使减少重复代码且程序易读.perl中,子程序可以出现在程序的任何地方.但一般放在程序的开始或结尾. 复制代码 代码如下: sub subroutine{     statements; } sub开始,子程序名同变量的命名规则,可与变量同名,最好不要与内部函数同名,如果与内部函数同名则用$subroutine区分,不用&是内部函数,用&是定义函数,但省略&时混淆. 带有原型说明的子程序定义: 复制代码 代码如下: sub subrouti

Perl中的模式匹配学习笔记_perl

一.简介模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即模式def.其用法如结合函数split将字符串用某模式分成多个单词:@array = split(/ /, $line); 二.匹配操作符 =~.!~=~检验匹配是否成功:$result = $var =~ /abc/;若在该字符串中找到了该模式,则返回非零值,即true,不匹配则返回0,即false.!~则相反.这两个操作符适于条件控制中,如: 复制代码 代码如下:    if ($question =~ /please/

PERL脚本 学习笔记_基础教程

1. chomp无参数时,使用默认参数,将对$_操作. 2. 数组@array..可用$array[number]引用.$#array..表示数组中索引数. 3. $!包含出错信息: 4. 默认打开文件句柄的方式是"<"即输入,">>"和">"区别就在于一个添加方式操作文件的. if(@ARGV < 2){ die "Not enough arguments\n"; } 5. select LOG

Perl学习笔记之CPAN使用介绍

  这篇文章主要介绍了Perl学习笔记之CPAN使用介绍,本文讲解了什么是CPAN.CPAN的目录作用介绍.CPAN安装Perl Module的两种方法等内容,需要的朋友可以参考下 CPAN(Comprehensive Perl Archive Network:全面的Perl存档网络)是查找任何Perl有关的东西的中心仓库.它包含从整个Perl社区收集来的智慧:成百上千的 Perl模块和脚本,相当于好几本书的文档,以及整个Perl发布.如果有东西是用Perl写的,而且这个东西很有用而且是自由的,