• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >perl > Perl数组排序学习笔记

Perl数组排序学习笔记

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了Perl数组排序学习笔记等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文我们学习如何用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;
</div>
上边的例子将会打印
$VAR1 = [
        'foo',
        'bar',
        'zorg',
        'moo'
      ];
 
$VAR1 = [
        'bar',
        'foo',
        'moo',
        'zorg'
      ];
</div>
第一个输出显示了排序前的数组,第二个是排序后的。

这是最简单的情形,但是可能未必是你想要的。 比如,如果一些单词以大写字母开头怎么办?
my @words = qw(foo bar Zorg moo);
@sorted_names里的结果将是:

$VAR1 = [
        'Zorg',
        'bar',
        'foo',
        'moo'
      ];
</div>
你会发现,以大写字母开头的单词排在了第一位。 这是因为sort默认根据ASCII码表排序,所有的大写字母都排在小写字母前边。

比较函数

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

通常你看不到比较函数,sort会根据ASCII码表对值进行比较,不过如果你想的话,你可以显式的写出来:
sort { $a cmp $b } @words;
</div>
这段代码会跟没有使用块的sort @words达到同样的效果。

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

按字母顺序排列
如果你想忽略字符串的大小写来排序——即通常所谓的字母序,你可以像下一个例子这么做:
my @sorted_words = sort { lc($a) cmp lc($b) } @words;
</div>
这里为了比较,我们调用lc函数返回参数的小写版本。然后cmp比较这些小写版本并决定原始字符串谁先谁后。

结果是
$VAR1 = [
        'bar',
        'foo',
        'moo',
        'Zorg'
      ];
</div>

Perl对数值排序
如果对数值数组使用sort进行默认的排序,结果可能不是我们期望的。
my @numbers = (14, 3, 12, 2, 23);
my @sorted_numbers = sort @numbers;
say Dumper \@sorted_numbers;
$VAR1 = [
        12,
        14,
        2,
        23,
        3
      ];
</div>
仔细一想的话,这并不奇怪。比较函数看到12和3时,它按字符串进行比较。这意味着比较两个字符串的第一个字符"1"和"3"。 在ASCII码表里,"1"在"3"前边,因此字符串"12"会排在字符串"3"前面。

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

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

结果是:
$VAR1 = [
        2,
        3,
        12,
        14,
        23
      ];
</div>

</div>

您可能想查找下面的文章:

相关文章

  • perl 采集入库脚本分享
  • Perl List::Util模块使用实例
  • 让apache2以cgi方式运行perl cgi程序的实现方法
  • Perl使用File::Basename获取文件扩展名的代码
  • [Perl]文字/代码批量替换工具
  • Perl localtime时间函数的应用介绍
  • perl与shell获取昨天、明天或多天前的日期的代码
  • Perl一句话命令行编程中常用参数总结
  • perl 变量 $/ 的用法解析 上下文为行模式时,$/ 定义以什么来区分行
  • Perl的Mail::POP3Client模块和Gmail通信实例

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 使用perl清理电脑上重复文件实现代码(续)
    • perl写的一个随机编故事的程序(rand随机函数)
    • perl 读取所需文件的路径,然后打开相应的文件
    • perl处理xml的模块介绍
    • perl脚本学习指南--读书笔记
    • python urllib中的编码处理示例
    • Perl使用nginx FastCGI环境做WEB开发实例
    • Windows和Linux系统下perl连接SQL Server数据库的方法
    • perl 变量 $/ 的用法解析 上下文为行模式时,$/ 定义以什么来区分行
    • Shell编程的一些知识集合

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有