查看原文
其他

Perl零零八速成系列---字符串操作与排序

晨光 生信者言 2022-03-29

阅读用时:全文共2部分,约1900字,约5分钟

关键词:Perl语言,字符串操作与排序




在上一节Perl编程课程中,我们介绍了Perl语言的特色技能——正则表达式,并结合一个实例进行了讲解。


大多情况下,正则表达式的主要处理对象是字符串,那么今天,我们就来一起学习下字符串操作与排序。

《Perl零零八速成系列》(共8节课)主要是面向无Perl编程经验或者Perl语言初学者,介绍Perl的基本知识和实用编程技巧。晨光与你一路,轻松点亮编程技能,一跃成为特工级的Perl编程牛人!

【前情回顾】

《Perl零零八速成系列---数据结构入门》

《Perl零零八速成系列---哈希和子函数》

《化腐朽为神奇,编程语言不可错过之正则表达式》

《实例精解!如何从海量序列信息中提取目标序列》


【本节内容】

本节内容包括Perl 语言的字符串操作和排序。


 

一、字符串的一般操作

 

1、index操作

 

如果我们想查找某个子字符串在主字符串中的相对位置,可以用index函数来实现。Perl会在主字符串中寻找子字符串首次出现的地方,并返回一个整数表示第一个字符的匹配位置(或者跳过的字符数),返回的字符位置从0算起,如果没有找到,那么就返回-1。例如:

 

#!/usr/bin/perl

 

my $stuff="Hello world!";

my $where= index($stuff,"wor");

 

print "$where\n";

 

运行结果:

6

 

PS: 注意,空格" "也算一个字符哦!

 

另外,你如果加上可选的第三个参数来指定开始搜索的地方,这样index就不会从字符串的最开头寻找,而是从改参数指定的位置开始寻找子字符串:

 

my $stuff="Hello world!";

my $where= index($stuff,"o",6);

 

print "$where\n";

 

运行结果:

7

 

2、rindex操作

 

如果我们不是从字符串开头进行查找,而是想从字符串末尾的地方开始查找,那么可以用rindex函数来实现,而且也可以加上可选的第三个参数,用来限定返回值的上限:

 

#!/usr/bin/perl

 

my $where1 = rindex("Yabbadabba doo!","abba");

my $where2 = rindex("Yabbadabba doo!","abba",6);

 

print "$where1\n";

print "$where2\n";

 

运行结果:

7

1

 

3、substr操作

 

substr函数只处理较长字符串中的一小部分内容,大致用法如下:

 

my $part=substr($string,$initial_position, $length);

 

它一般需要三个参数:一个原始字符、一个从零起算的起始位置以及子字符串的长度。找到的字符串会被返回:

 

my $rock =substr("Fred J. Flintstone", 13, 5);

print "$rock\n";                      #输出:stone

 

和index一样,起始位置可以用负数表示从结尾倒数,例如:

 

my $rock =substr("Fred J. Flintstone", -3, 5);

print"$rock\n";                       #输出:one

 

此外,substr函数可选的第四个参数是替换子字符串,返回值是替换前的子串,例如:

 

my$string="Fred J. Flintstone";

my $rock =substr($string, 0, 4, "Bob");

print"$string\n$rock\n";

 

运行结果:

Bob J.Flintstone

Fred

 

4、printf 操作

 

相信大家还记得第一节课里面输出Hello,World!的print函数,如果将print比如成一台普通打印机,那么printf 就是一台智能打印机。printf函数负责将格式化的字符串输出到选定的文件句柄。其默认文件句柄是 STDOUT(标准输出)。如果 printf 函数执行成功,其返回值是 1,否则为 0。

 

printf 函数后面带有一个加有引号的负责格式规范的控制字符串。其后则是一系列由逗号隔开的参数(详见下表),例如:

 

$user="Mike";

$days_to_die=30;

printf"Hello, %s; your password expires in %d days!\n", $user,$days_to_die;

 

运行结果:

Hello, Mike;your password expires in 30 days!

 

格式化转换符

 

标记修饰符位于 % 之后,负责进一步定义输出的格式。例如,%-20s 表示输出长度为 20 个字符的左对齐的字符串。例如:

 

printf"%-15s\n", "flintstone"; 


输出结果:

flintstone`````

 

PS: 这里`表示空格" "

 

 

标记修饰符

 

 

5、sprintf操作

 

sprintf 函数可以将格式化后的字符串存放在变量里面,以便稍后使用。它的一种常见的用法就是格式化小数点后面具有特定精度的数字。例如:

 

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

print"$money\n"; 


输出结果:

2.50

 

我们在处理较大数据(比如金额、测序数据量)时,如果希望在相应的位置加上逗号,从而提高阅读性,可以用sprintf和正则表达式来处理,例如:

 

sub big_money{

my $number =sprintf "%.2f", shift @_;

# 在正确的位置加上","


1 while$number =~ s/^(-?\d+)(\d\d\d)/$1,$2/;         #"-?":可有可无的"-",表正负数

#在正确的位置加上美元符"$"


$number =~s/^(-?)/$1\$/;

print"$number\n";

}

 

&big_money(12345678.90);

 

运行结果:

$12,345,678.90

 

PS: 各位童鞋看完这里的while循环和正则表达式,是否能感受到Perl的灵活性呢?如果有不懂的,可以私信我们,我们会尽快做出详细的介绍~

 

 

二、字符串的排序

 


在实际运用过程中,我们经常会按照需要对字符串进行排序,例如按照人名、地名、基因名称等进行排序。今天的课程我们一起来学习一下字符串排序的方法。

 

1、简单排序

 

在第一节课里面,我们介绍了能对数组元素进行排序的sort函数,包括根据字典或数字顺序(或逆序)排序,例如:

 

my @names =("Jack","Andy","Rose","Bob","Tom");

@SORT1 = sort@names;                            #默认按字典顺序排序

@SORT2 = sort{$b cmp $a} @names;       #按字典逆序排序, $a和$b表示小和大

print"@SORT1\n";                             

print"@SORT2\n"; 

 

运行结果:

Andy Bob JackRose Tom

Tom Rose JackBob Andy

 

2、高级排序

 

除了上面的简单排序,我们可能还会用到一些较高级的排序方法,例如按照哈希的值进行排序、按照多个键进行排序等。例如:

 

my %score =("barney" => 195, "fred" => 205, "dino"=> 30);

my @winners =sort by_score keys %score;         #对哈希的值进行排序

print"@winner\n ";

 

sub by_score { $score{$b} <=> $score{$a}}          #定义子程序,按照哈希值逆序排列

 

运行结果:

fred barney dino

 

PS: 一般在使用过程中,我们可以省略子程序定义这一步,直接在sort命令后定义排序规则,即:

my @winners =sort { $score{$b} <=> $score{$a} } keys %score;  

 

说起排序,想必大家经常会见到各种排名,比如考试成绩排名、世界大学排名以及个人财富排名等,那么肯定会遇到并列的情况,这时候就会根据其它规则进行排序。这里我们就介绍一下按照多个键进行排序的方法,例如:

 

my %score = (

"barney"=> 195, "fred" => 205, "dino" => 30,"bamm-bamm" => 195,

);

 

my @winners =sort by_score_and_name keys %score;      #对哈希的值和键进行排序

print"@winner\n ";

 

sub by_score_and_name {

$score{$b}<=> $score{$a}          #按照哈希的值逆序排列

or

$a cmp $b                                   #或按照哈希键的顺序排列

}

 

运行结果:

fred bamm-bamm barney dino

 

 

本文尽量精简地介绍了Perl语言中符串操作与排序,并配上简单的示例供大家练习巩固。由于篇幅有限,难以深入展开说明,谨以此文,送与初入门Perl语言的朋友们。

 

下一节课我们将学习:输入输出与控制结构,敬请大家关注!


参考资料:

《Perl语言入门第六版(中文版)》

http://www.runoob.com/perl/perl-tutorial.html

http://www.runoob.com/try/runcode.phpfilename=HelloWorld&type=perl





【完】


未经授权,谢绝转载

 

扫码关注,获取更多精彩内容

喜马拉雅FM搜索并订阅:生信者言;收听内容:

《一分钟听懂NGS基础概念》,让生信分析不再遥不可及

《亲爱的姑娘,你值得被温柔以待》,11个真实的人物故事

《众病之王:癌症传》,一起聆听人类对抗癌症的斗争史

回复文字:果然科学,看一篇好玩的科普文。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存