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

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


首先是姐妹花index和rindex

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

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

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


既然可以查找字符串的位置,那么就自然想到截取一段序列,这时候要用到substr函数(其实这个概念我是从excel中知道的)
还是刚才那个序列,这次的目的是:提取出第二个ATG开始到最后一个TAA结束的序列:
思路就是知道要截取的序列,知道开始位置,知道截取长度就可以了。
mark
mark
成功,这里substr也有三个参数,第一个为要匹配的序列,第二个为开始的位置,第三个为匹配的长度。


这里我们自然而言地想到,可以截取出一段序列,那么将它替换成其他序列便是举手之劳:
mark
mark
实际上,这里的substr功能完全可以用正则表达式来实现,本次不作介绍。


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


那么我们再进一步,如何分割字符串呢?用split函数,实际上到了这里我们发现,perl语言中的命令完全就是日常用语,可能原因是,perl的发明者本身就是语言学家,那么设计语言时最好满足自然语义。
首先创建一个逗号分隔的字符串,然后尝试几种split分隔的模式及其返回的结果,学习perl语言光看书不行,必须要动手操作,在一个终端里面即时反馈,错了就调试。
mark
mark
split的基本用法就是两个参数,返回的是数组,从\@split4可以看出来(4),如果使用标量上下文返回的是数组元素的个数(1),如果在末尾加上第三个参数,数字参数,就是限定最终切割的个数,如果是1就是不切割(2,3),因为split返回的是数组,所以可以使用 []访问数组中的元素(6,7,8,9),还可以同时命名三个标量,分别赋值见ABC。


我们可以分割字符,也可以让他们再次连接在一起,而且可以定义连接的方式
使用join函数;实际上split和join就是相反的过程:
mark
mark


此时,那些基本的求序列长度,去掉序最后一个字符,字符大小写转换,首字母大小写也需要一并掌握,实际上这时候会感觉很简单:
mark
mark
一开始序列长度为56,使用chop切掉末尾的T后只剩下56个,使用lc转换成小写,再使用uc转换成大写,使用lcfirst将首字母小写,使用ucfirst将首字母大写,最后尝试了另外的转换大小写的方式。


##sort排序功能特别重要
perl提供了飞碟操作符:

  • \$a <=> \$b 数字大小排序
  • \$a cmp \$b 字母顺序排序

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

  • 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是有返回值的。
    mark
    此时我们再来理解10的表达式,如果前面两个字母相同,那么返回值就是0,or和||的意思就是如果前面是假则执行后面的程序。
    这种方法在hash的排序中也有广泛的使用。

##关于hash的排序
准确的说,hash是不能排序的,能够排序的是hash的键名和键值
我们先按照键名来排序:
mark
mark
实际上生活中更常见的是按照分数从大到小排序,用\$score{$a},表示键名对应的键值:
mark
mark
我们发现,95分有两个人,我们希望当分数一样的安装名称的字母排序
mark
mark


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

------ 本文结束------