1. 用sprintf格式化字符串

sprintf函数与printf有相同的参数(可选的文件句柄参数除外),但sprintf函数返回的是结果字符串,而不会直接打印出来

sprintf函数的方便之处在于,可以将格式化后的字符串存放在变量里以便稍后使用

my $date_tag = sprintf"%4d/%02d/%02d %2d:%02d:%02d",$yr, $mo, $da, $h, $m, $s; # 得到类似 2038/01/19 3:00:08的结果

格式化定义中数字字段的前置零表示必要时会在数字前补零以符合指定的宽度要求

2. 用sprintf格式化金额数字

sprintf的常见用法是格式化小数点后具有特定精度的数字

my $money = sprintf "%.2f", 2.49997; # 2.50

下面这个子程序可以用于:手头上有个财务数据非常大,需要使用逗号分隔以方便阅读

sub big_money{my $number = sprintf "%.2f", shift @_;# 下面的循环中,每次匹配到合适的位置加一个逗号1 while $number =~ s/^(-?\d+)(\d\d\d)/$1, $2/; # 这里的1是while循环的主体,实际上是个占位符!# 在正确的位置补上美元符号$number =~ s/^(-?)/$1\$/;$number;
}

3. 高级排序

之前介绍了使用内置的sort操作符,以ASCII码对列表排序,但是之前我们不能按数字大小排序,也不能以不区分大小写的方式排序,还不能按照存储在哈希内的信息排序
perl能以任何需要的顺序来为列表排序
perl可以建立自己的“排序规则子程序(sort-definition subroutine)”,简称“排序子程序(sort subroutine)”,来实现自定义的排序方式
perl其实知道怎么对列表排序,它只是不知道要用什么养的规则,所以排序子程序只是用来说明具体的规则

排序子程序并不需要比较许多元素,只要能比较2个元素就行
排序子程序的定义和普通子程序几乎相同,它会被反复调用,每次都会检查要排序的列表中的两个元素

sub any_sort_sub { # 实际上这么写不能正确工作,这里只是为了方便说明问题my($a, $b) = @_; # 声明两个变量并给它们赋值# 在这里开始比较$a和$b...
}

排序子程序会一次次地被调用,往往会允许上百或上千次,这取决于被配序数据的规模

实际上在排序子程序中并不需要声明$a$b,因为它们都被自动赋值好了。子程序会返回一个数字,用来表示两个元素间的大小关系(就像C语言中qsort(3)的调用机制,但调用它的是Perl内置的排序机制)
a < b 的话,返回-1
a = b 的话,返回0
a > b 的话,返回1

sub by_number {if ($a < $b){-1} elsif ($a > $b ) {1} else {0}
}

怎么调用这个排序子程序呢?

my @result = sort by_number @some_numbers;

因为常常需要用到三路比较,所以perl提供了一个方便的简写,飞碟操作符 <=>,飞碟操作符会比较两个数字并返回-1,0或1,好让它们按数字排序

sub by_number { $a <=> $b }

因为飞碟操作符只能用来比较数字,所以说有另外一个比较字符串的三路字符串比较操作符 cmp

sub by_code_point {$a cmp $b}
my @strings = sort by_code_point @any_strings;

不过cmp可以用来建立更复杂的排序规则,例如不区分大小写的排序

sub case_insensitive {"\L$a" cmp "\L$b"}

unicode字符串里的字符有事可以用不同形式表示,为了按照实际字符意义排序,我们需要先把某种表示形式转化为统一的形式再进行比较排序

use Unicode::Normalize;
sub equivalents {NFKD($a) cmp NFKD($b)}

需要注意的是,在比较过程中,我们没有修改被比较元素的值,我们只是用它们的值比大小而已
出于性能考虑,$a$b不是数据拷贝,实际上它们只是原始列表元素的临时化名,所以如果修改了它们的值,实际值也会被修改

my @numbers = sort { $a <=> $b } @some_numbers;
my @descending = reverse sort { $a <=> $b } @some_numbers;

有个小窍门,比较操作符其实并不知道哪个操作数是$a,哪个操作数是$b,比较操作符只知道一个值在左,一个值在右,所以说,如果我们把$a$b对调,比较操作符每次都会得到相反的结果

my @descending = sort { $b <=> $a } @some_numbers; #这样也可以获得反向排序的结果

4. 按哈希值配序

my %score = ("barney" => 195, "fred" => 205, "dino" => 30);
my @winners = sort by_score keys %score;sub by_score { $score{$b} <=> $score{$a} }

5. 按多个键排序

my %score = {"barney" => 195, "fred" => 205,"dino" => 30, "bamm-bamm" => 195,
};my @winner = sort by_score_and_name keys %score;sub by_score_and_name {$score{$b} <=> $score{$a} # 先按照分数降序排列or$a cmp $b # 分数相同的再按名字的ASCII码序排列
}@winners@patron_IDs = sort {&fines($b) <=> &fines($a) or$items{$b} <=> $items{$a} or $family_name{$a} cmp $family_name{$b} or$personal_name{$a} cmp $family_name{$b} or$a <=> $b
} @patron_IDs;

Perl-字符串与排序2相关推荐

  1. 深入理解苹果系统(Unicode)字符串的排序方法

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由iminder发表于云+社区专栏 Unicode编码 我们知道计算机是不能直接处理文本的,而是和数字打交道.因此,为了表示文本,就建立 ...

  2. perl 字符串删除末尾几个字符_Perl字符串处理函数大全

    本文重点讨论Perl字符串处理函数的用法,每种函数都有各自的特点和作用, 下面请看本文详细介绍. Perl字符串处理函数 1. index 语法: position=index(string,subs ...

  3. java list字符排序吗_List中存放字符串进行排序

    package com.bjpowernode.t03sort; import java.util.ArrayList; import java.util.Collections; /* * List ...

  4. boost::sort模块实现spreadsort 字符串函子排序示例

    boost::sort模块实现spreadsort 字符串函子排序示例 实现功能 C++实现代码 实现功能 boost::sort模块实现spreadsort 字符串函子排序示例 C++实现代码 #i ...

  5. C语言字符串左右排序交换

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105164028 C ...

  6. python 字符串比较忽略大小写的方法_python实现忽略大小写对字符串列表排序的方法...

    本文实例讲述了python实现忽略大小写对字符串列表排序的方法,是非常实用的技巧.分享给大家供大家参考.具体分析如下: 先来看看如下代码: string = ''' the stirng Has ma ...

  7. SQL对字符串进行排序

    SQL对字符串进行排序 假设字符串中只由'A'.'B'.'C'.'D'组成,且长度为7.并设函数REPLICATE(<字符串>,<n>)可以创建一个<字符串>的n个 ...

  8. 使用qsort()和bsearch()函数对值和字符串进行排序和查找

    2019独角兽企业重金招聘Python工程师标准>>> #include <stdio.h> #include <stdlib.h> #define MAX ...

  9. java把abcedf字符串进行排序_字符串合并处理 - 一贱书生的个人空间 - OSCHINA - 中文开源技术交流社区...

    题目描述 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串 ...

  10. Bailian3729 用set实现字符串的排序和查找【文本处理】

    3729:用set实现字符串的排序和查找 总时间限制: 1000ms 内存限制: 65536kB 描述 输入若干只包含数字的字符串,要求按它们被看作整数时的大小排序,并以从大到小的顺序输出.重复的字符 ...

最新文章

  1. LSGO:团队学习模式“社群化”讨论!
  2. LA4234 Binary Clock(进制转换)
  3. OpenCV下的灰度直方图生成及显示的源码,带详细注释
  4. Could not load java.net.BindException错误解决
  5. LeetCode 527. 单词缩写(Trie树)
  6. RESTful开发风格
  7. vhs预设_使用Linux将VHS数字化,创建Bash完成脚本,Ansible,家庭自动化等
  8. python \__class__
  9. ShardingSphere-Proxy 主从读写 入门使用
  10. F - Warm up - hdu 4612(缩点+求树的直径)
  11. Android 号码, 来电归属地 Jni 使用C++对二进制文件查询(一) 理论篇
  12. [转载]上善若水,厚德载物
  13. Javascript三种创建对象的方法,new关键字,for...in 遍历对象
  14. Internet Explorer更改MIME处理方式以提高安全性
  15. 重新安装windows中已删除的Wireless Zero Configuration(WZC)服务
  16. matlab 齐次线性方程组,利用matlab求解RE中出现的齐次线性方程组
  17. NO.013-2018.02.18《鹊桥仙·纤云弄巧》宋代:秦观
  18. maximo工作流底色更改
  19. JAVA面试、笔试题
  20. 金蝶云星空插件开发调试教程示例

热门文章

  1. nginx网页地址重定向
  2. 发送网页地址确定对方ip
  3. Jess学习基础(一)
  4. 使用飞信api接口实现短信发送(只能发送好友)
  5. 项目的质量控制与质量保证的区别与联系
  6. 逐步解析力扣846. 一手顺子 (贪心)
  7. Verilog实现移位寄存器
  8. H5移动端实现图片上传
  9. echarts实现中国地图(Vue)
  10. 商丘工学院c语言试卷,商丘工学院New Radio82期:青春