最近在处理三代测序的下机数据,用到了一些挺好用的perl脚本,但是苦于没接触这种类型的编程语言,想根据情况改一些代码却看不懂实现方式= =
前面说学习perl可以只学怎么调用模块,马上啪啪打脸了,这货和python还是有点不一样的,还是抽空补补基础吧~现在做生信用的最多的就是R、python和perl,多掌握一门编程语言还是挺有必要的。记录一下自学的过程和笔记,自学视频来源是b站up主生信技能树-jimmy
示例
首先了解一下perl脚本的结构,以blast结果过滤的perl脚本为例,输入文件blast_m8.out是一个12列,分隔符为空格的文件:
1 | #!/bin/perl -w # 选择解释器类型为perl,-w是运行错误时提供警告信息 |
OK,格式与python不一样,以分号作为每一行结尾,基础语法类似但不完全一样,先从基础学起。
1 标量数据
标量数据特点
- perl中最基本的数据类型
- 可以是数字、字母
- 无需定义类型(所有perl语言的数据都是双精度浮点型,不需要对数据类型进行定义,代价是消耗内存)
- “单数为标量”
字符串运算
- 字符串就是一连串字符组合,可以是字母数字标点等
- 对DNA序列处理本质上就是处理字符串
- 字符串可以为空
- 需要“引号”,尽量使用双引号
- 字符串连接“.”或者“x” 如 “hello” . “world”
标量变量
标量变量用来动态存储标量值,以美元符号$表示(定义数组用@符号),和linux一样不能以数字开头
1 | # 一个=表示赋值,两个==表示判断,这里和python是一样的 |
2 数组和列表
数组构建
列表(list)指标量的有序集合,数组(array)则是存储列表的变量
1 | @array=(1,"hello",undef,$dna,5); # 左边为数组,右边为列表,构建列表中间用逗号隔开 |
split和join函数
- split将字符串根据固定的分隔符进行切割,切割后得到一个数组
- join与split相反,将数组连接成一个标量
1 | #!/bin/perl |
pop和push函数
1 | #!/bin/perl |
shift和unshift函数
1 | #!/bin/perl |
一般来说pop和shift用的比较多,一个提取数组末尾元素,一个提取数组开头元素。
因为我们用perl处理的往往是矩阵文件,第一行是ID信息,我们往往是读入一行数据,去掉换行符,存储为标量,分割数组。这个时候就要用shift函数,将ID提取出来,这样呢后面都是同一种类型的数据,方便我们操作,也就是底下这个框架:
1 | #!/bin/perl |
sort和reverse函数
1 | #!/bin/perl |
可以看到10在1的后面,因为sort函数是以ASCII码大小进行排序的。
1 | #!/bin/perl |
reverse函数在做DNA反向互补配对的时候能用到。
foreach遍历数组
1 | #!/bin/perl |