Perl零零八速成系列---字符串操作与排序
Posted 生信者言
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl零零八速成系列---字符串操作与排序相关的知识,希望对你有一定的参考价值。
阅读用时:全文共2部分,约1900字,约5分钟
关键词:Perl语言,字符串操作与排序
在上一节Perl编程课程中,我们介绍了Perl语言的特色技能——正则表达式,并结合一个实例进行了讲解。
大多情况下,正则表达式的主要处理对象是字符串,那么今天,我们就来一起学习下字符串操作与排序。
《Perl零零八速成系列》(共8节课)主要是面向无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 ";
运行结果:
6
PS: 注意,空格" "也算一个字符哦!
另外,你如果加上可选的第三个参数来指定开始搜索的地方,这样index就不会从字符串的最开头寻找,而是从改参数指定的位置开始寻找子字符串:
my $stuff="Hello world!";
my $where= index($stuff,"o",6);
print "$where ";
运行结果:
7
2、rindex操作
如果我们不是从字符串开头进行查找,而是想从字符串末尾的地方开始查找,那么可以用rindex函数来实现,而且也可以加上可选的第三个参数,用来限定返回值的上限:
#!/usr/bin/perl
my $where1 = rindex("Yabbadabba doo!","abba");
my $where2 = rindex("Yabbadabba doo!","abba",6);
print "$where1 ";
print "$where2 ";
运行结果:
7
1
3、substr操作
substr函数只处理较长字符串中的一小部分内容,大致用法如下:
my $part=substr($string,$initial_position, $length);
它一般需要三个参数:一个原始字符、一个从零起算的起始位置以及子字符串的长度。找到的字符串会被返回:
my $rock =substr("Fred J. Flintstone", 13, 5);
print "$rock "; #输出:stone
和index一样,起始位置可以用负数表示从结尾倒数,例如:
my $rock =substr("Fred J. Flintstone", -3, 5);
print"$rock "; #输出:one
此外,substr函数可选的第四个参数是替换子字符串,返回值是替换前的子串,例如:
my$string="Fred J. Flintstone";
my $rock =substr($string, 0, 4, "Bob");
print"$string $rock ";
运行结果:
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! ", $user,$days_to_die;
运行结果:
Hello, Mike;your password expires in 30 days!
格式化转换符
标记修饰符位于 % 之后,负责进一步定义输出的格式。例如,%-20s 表示输出长度为 20 个字符的左对齐的字符串。例如:
printf"%-15s ", "flintstone";
输出结果:
flintstone`````
PS: 这里`表示空格" "
标记修饰符
5、sprintf操作
sprintf 函数可以将格式化后的字符串存放在变量里面,以便稍后使用。它的一种常见的用法就是格式化小数点后面具有特定精度的数字。例如:
my $money =sprintf "%.2f", 2.49997;
print"$money ";
输出结果:
2.50
我们在处理较大数据(比如金额、测序数据量)时,如果希望在相应的位置加上逗号,从而提高阅读性,可以用sprintf和正则表达式来处理,例如:
sub big_money{
my $number =sprintf "%.2f", shift @_;
# 在正确的位置加上","
1 while$number =~ s/^(-?d+)(ddd)/$1,$2/; #"-?":可有可无的"-",表正负数
#在正确的位置加上美元符"$"
$number =~s/^(-?)/$1$/;
print"$number ";
}
&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 ";
print"@SORT2 ";
运行结果:
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 ";
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 ";
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个真实的人物故事
《众病之王:癌症传》,一起聆听人类对抗癌症的斗争史
回复文字:果然科学,看一篇好玩的科普文。
以上是关于Perl零零八速成系列---字符串操作与排序的主要内容,如果未能解决你的问题,请参考以下文章