05-perl语言中的字符串处理及排序

Posted 果子学生信

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了05-perl语言中的字符串处理及排序相关的知识,希望对你有一定的参考价值。

生物信息中的数据是以字符串形式呈现的,而perl语言90%的常用功能都在处理字符串上。所以我用了一些时间来学习这些处理字符串的手段。
比较重要的是index,substr,sort。


首先是姐妹花index和rindex

  • index 从左边开始给出匹配字符的首字符位置

  • rindex 从右边开始给出匹配字符的首字符位置

注意:字符串的第一个位置为0
因为放假没办法用到服务器,所以perl语言的学习全是在mac电脑的终端完成的,其实和linux的终端完全一样。
下面我们设计了一个字符串,他有两个ATG,第一个ATG的A的位置为0,第二个ATG的A的位置为15,我们试一下:


05-perl语言中的字符串处理及排序

index和rindex有三个参数,第一个为要匹配的序列,第二个为目标字符串,第三个为开始匹配的位置(这个参数可选),当index匹配不到字符串时返回-1,例子中,第四个我们让他从第20个字符开始查找ATG,实际上没有20之后没有ATG了,所以返回值为-1


既然可以查找字符串的位置,那么就自然想到截取一段序列,这时候要用到substr函数(其实这个概念我是从excel中知道的)
还是刚才那个序列,这次的目的是:提取出第二个ATG开始到最后一个TAA结束的序列:
思路就是知道要截取的序列,知道开始位置,知道截取长度就可以了。
05-perl语言中的字符串处理及排序

05-perl语言中的字符串处理及排序

成功,这里substr也有三个参数,第一个为要匹配的序列,第二个为开始的位置,第三个为匹配的长度。


这里我们自然而言地想到,可以截取出一段序列,那么将它替换成其他序列便是举手之劳:

05-perl语言中的字符串处理及排序
05-perl语言中的字符串处理及排序
实际上,这里的substr功能完全可以用正则表达式来实现,本次不作介绍。


我们再看看处理的序列由碱基ATCG组成,对于生信工作者而言,把他转换成互补序列,反向序列,反向互补序列也应该成为正常需求。
其中反向序列,很好实现,用reverse函数即可,而互补序列用正则表达式的转换功能tr即可(正则表达式有三种模式,匹配,替换,转换),反向互补序列把得到的互补序列reverse即可:

05-perl语言中的字符串处理及排序
05-perl语言中的字符串处理及排序


那么我们再进一步,如何分割字符串呢?用split函数,实际上到了这里我们发现,perl语言中的命令完全就是日常用语,可能原因是,perl的发明者本身就是语言学家,那么设计语言时最好满足自然语义。
首先创建一个逗号分隔的字符串,然后尝试几种split分隔的模式及其返回的结果,学习perl语言光看书不行,必须要动手操作,在一个终端里面即时反馈,错了就调试。

05-perl语言中的字符串处理及排序
05-perl语言中的字符串处理及排序
split的基本用法就是两个参数,返回的是数组,从@split4可以看出来(4),如果使用标量上下文返回的是数组元素的个数(1),如果在末尾加上第三个参数,数字参数,就是限定最终切割的个数,如果是1就是不切割(2,3),因为split返回的是数组,所以可以使用 []访问数组中的元素(6,7,8,9),还可以同时命名三个标量,分别赋值见ABC。


我们可以分割字符,也可以让他们再次连接在一起,而且可以定义连接的方式
使用join函数;实际上split和join就是相反的过程:
05-perl语言中的字符串处理及排序
05-perl语言中的字符串处理及排序


此时,那些基本的求序列长度,去掉序最后一个字符,字符大小写转换,首字母大小写也需要一并掌握,实际上这时候会感觉很简单:
05-perl语言中的字符串处理及排序
05-perl语言中的字符串处理及排序

一开始序列长度为56,使用chop切掉末尾的T后只剩下56个,使用lc转换成小写,再使用uc转换成大写,使用lcfirst将首字母小写,使用ucfirst将首字母大写,最后尝试了另外的转换大小写的方式。


sort排序功能特别重要

perl提供了飞碟操作符:

  • $a <=> $b 数字大小排序

  • $a cmp $b 字母顺序排序

数字排序:
05-perl语言中的字符串处理及排序

05-perl语言中的字符串处理及排序

使用sort直接排序并不能按数字大小排序
字母排序:
借助字母的排序我测试了几种排序的方法以实现不同的效果

05-perl语言中的字符串处理及排序
05-perl语言中的字符串处理及排序

通过测试,我发现:

  • sort和cmp效果相同(1-2)

  • 四种忽略大小写的方法都可以实现相同的结果(3-6)

  • 调换$a和$b的位置可以实现和reverse一样的功能(7-8)

  • 对sort后的数组再用cmp排序可以实现按字母排序,并且大写字母在前(9)

  • 我想怎么实现小写字母在前呢?在9的基础上,增加判断语句,当两个字母相同时,让小写字母在前面(10)


借助10的结果,学习一下$a cmp $b以及 $a <=> $b的功能,实际上他们是sort的一个参数
我们先看一下sort的用法

  • 直接使用,就是sort @array

  • 自定义排序
    sort {sub rule} @files
    {}中就是排序的原则,$a <=> $b的意思就是按数字从小到大排序,$a cmp $b
    就是按字母顺序排序,$,$b是系统的全局变量,我们记住有这样的用法即可,其中$a cmp $b以及 $a <=> $b是有返回值的。

    05-perl语言中的字符串处理及排序
    此时我们再来理解10的表达式,如果前面两个字母相同,那么返回值就是0,or和||的意思就是如果前面是假则执行后面的程序。
    这种方法在hash的排序中也有广泛的使用。


关于hash的排序

准确的说,hash是不能排序的,能够排序的是hash的键名和键值
我们先按照键名来排序:
05-perl语言中的字符串处理及排序
05-perl语言中的字符串处理及排序

实际上生活中更常见的是按照分数从大到小排序,用$score{$a},表示键名对应的键值:
05-perl语言中的字符串处理及排序
05-perl语言中的字符串处理及排序
我们发现,95分有两个人,我们希望当分数一样的安装名称的字母排序




我想我应该已经入门perl字符串的处理了。

以上是关于05-perl语言中的字符串处理及排序的主要内容,如果未能解决你的问题,请参考以下文章

阶段1 Go语言基础Day02 数组切片切片原理map字符串处理/字节切片排序

字符串相关(排序, 单词查找树, 子字符串查找)

C语言 字符串处理函数strtok第二次及以后的调用中第一个参数要用NULL的原因是啥? 能不能解释下原理?

js正则及常用方法函数总结

c语言 用指针方法处理:输入一行字符,统计并输出其中大写字母、小写字母、空格、数字及其它字符的个数。

C语言篇 + 字符串处理函数和内存函数的介绍及模拟实现(避开你的语法坑,请注意查收)