今天是生信星球陪你的第71天
你想找辆共享单车,发现满街都是别家车,没有一辆你能骑。
你想学点生信,搜了“初学者教程”,满眼尽是高大上,没有一句能看懂。
终于你跨越茫茫宇宙,来到生信星球,发现了初学者的新大陆!
豆豆开始学Perl~
所有的学习都是通过了解是什么、为什么后才有兴趣探究怎么做
.Perl是什么?
Perl(Practical Extraction and Report Language)实用报表提取语言,1987年由Larry Wall设计,大写的P是语言本身,小写的p意为程序运行的解释器。
被称为“梦幻脚本语言”,Unix中的王牌工具,兼容了正则表达式,整合了awk、sed等一系列好用的小语法
他的优势在于:开源免费、跨平台、直接运行无需编译、无需定义各种变量及类型,不像其他语言上来就需要学习定义整型、浮点型等、perl很灵活,有单行模式,配合Linux十分好用
.为什么用Perl处理生物数据?
Perl最大的优势就是处理字符串,而生信数据本质上就是将组织样本中的基因生物分子转为ATCGN这样的字符串来分析。
Perl内置了强大的正则表达式,善于处理字符串【例如我们常用的操作:统计序列ATCG含量、基因组GC含量、核苷酸翻译成氨基酸、序列提取某个片段、碱基互补配对】像这样的任务,其他语言可能需要十几行甚至几十行,但是Perl有时只要一行!
处理生物数据,不可能只有一个样品吧。这么多的样品,如果你用在线工具,也需要一会的时间,但是Perl提供了批量化处理的操作,大大提高效率,本来一个小时的任务,你两分钟干完,剩下时间泡杯咖啡看集美剧都不为过!
许多软件的结果可能并不是我们现在想要的,例如blast比对大量的样本,结果往往还需要进行过滤才能符合我们的要求,Perl可以对其进行筛选并且提取出想要的序列;文件格式的转换也常常用到Perl;另外许多软件也就是用Perl编写的,会了Perl在看他们的源代码就容易多了,方便纠错
Perl的作者就是语言学家,他开发的程序简单易懂
.一个例子
一个初学的
.数据结构
1 标量:
Perl中最基本的数据类型
可为数字、字母,无需定义类型【其他语言需要提前定义类型:比如,整型还是浮点型,是单精度浮点型还是双精度浮点型】Perl中都是按照双精度浮点型进行保存和运算的,内部不存在整型。即使是整数也会被当成浮点数来计算,这样就省去了提前定义的麻烦
直接量:
程序中直接定义的一个值,例如-30,8e-3
数字操作:
常用的加减乘除、取模/取余数(%)【10%3=1】、乘幂3**2【=9】
字符串运算:
字符串是一连串的字符组合,字符可以是字母、数字、标点,可以为空,需要引号
生信数据比如处理序列就是处理字符串,例如给出计算他的长度、反向序列、互补配对、碱基替换、截取、翻译氨基酸【看!是不是就是那些所谓的网页小工具实现的内容?用Perl全能做到】
字符串中的引号差别:
单引号中的内容表示内容本身(但表示单引号和反斜线需要转义)
双引号支持反斜线转义,单引号不支持
字符串操作:
连接字符串:使用连接两个文本,例如
使用 连接文本和数字,意思是重复几次,例如
【 表示5555, 表示20】
未定义的标量$_:
其他语言都要提前定义类型,Perl不需要提前定义,就等于先找个位置,用着什么就变成什么,比如用在数值计算中,他的值就是0;用在字符串中就表示空字符串; 或者刚读进来的每一行可以当成undef,一会再处理
2 变量变量命名:
美元 表示,命令规范:
不能以数字开头
可以用字母下划线开头,后面可以加数字
区分大小写,尽量用小写
命令要能懂它的用途,勿求短
不要用内部保留的变量名
变量赋值:
单个等号是赋值【两个等号才是计算等于】
、
得到的结果就是ACTAGACTAG
结尾以分号 结束
3 数据比较操作符优先级:
不需要记忆各个符号代表的优先次序,使用括号()可以自定顺序
比较操作符:4 换行符
了解这个非常重要!因为:有时在Linux下显示很好的文本文件移动到windows上用记事本打开后,所有的序列都会放在一行,十分的混乱,这是因为~
Linux中是换行; Mac中是回车 ;Windows是回车加换行
Linux中使用 显示出文件结尾的换行符:linux下结尾是 ,mac下的结尾就是 ,windows下就是
因此,这也说明了windows下的文本文件到了Linux中文件大小会增加,就是因为每行相比linux多了
怎样解决这个问题?
dos2unix: windows转换为linux
unix2dos:Linux转为windows
unix2mac:linux转为mac
mac2unix:mac转linux
chomp函数只去掉结尾的换行符,没有换行符就不起作用
chop 函数每次可以切掉结尾的一个字符,运行一次结尾少一个,既可以切换行符,又可以切回车符
5 列表与数组
列表(list)是指标量的有序集合;
数组(array)存储列表的变量
例如 中就是一个数组,右边就是一个列表
因此,打印的话,要么打印单个变量,要么打印数组
访问数组:
数组第一个值的下角标为0,
统计数组中元素个数:
等于数组的最后一个角标 +1
【那么想要知道数组最后一个元素的值就可以用或者 】
如何构建:
使用括号将元素括起来,并且之间逗号隔开;
使用范围操作符,适合连续加一的数值,例如就是1-20这20个元素构成的数组;
建立简单的字符串列表:如果每个字符串都加引号会很麻烦,可以这样:既不需要引号,也不需要逗号 【qw意思是quoted word】
另外括号作为界定符号,可以进行更换,将换成 都可以
数组赋值:
练习了一段时间,发现最大的疏忽就是结尾的 切记
两个数组相关函数:split和join【也就是标量和数组间的转化】
split:将字符串按照固定的分隔符进行切割,切完后得到一个数组
【后接三部分:分隔符,放在两个斜线之间;要分隔的字符串;分隔的份数,可以不写】
join:与split相反,将数组连接成一个标量
【后面冒号中的内容为分隔符,这里除了也可以用制表符,它等于四个空格,而用制表符分隔的一个好处就是:用excel打开后会识别这几项内容并显示在不同的列中】
对数组进行操作:
对数组尾部操作
pop:弹出数组中最后一个元素
push:向数组中最后一个位置加入一个元素【常用】
pop & push
对数组开头操作
shift :取出开头第一个元素【常用】
unshift:在开头第一个位置加入一个元素
对数组进行排序
sort:默认按照ASCII码由大到小排序,比如排序1-10,他会把10排在1的后面2的前面
reverse:逆向排序,不仅可以对数值还能对字符进行排序。例如:找到一段DNA序列的反向序列
遍历数组
6 上下文
同一个表达式,出现在不同的地方会有不同的意义【Perl中总是根据上下文来返回对应的值,主要看对标量进行操作还是对数组进行操作】
为什么要时刻关注上下文呢?
这个例子告诉我们,在Perl这个灵活多变的大环境中,同样的表达式@name用在不同地方,他都是对的。再一次印证了Perl的哲学思想:解决问题的办法不止一个!
7 获得帮助
获得内置帮助
-q xxx 在perldoc帮助文档中寻找包含xxx关键词的文档
-f 搜索Perl内置函数的功能
-v 搜索内置变量,如 perldoc -v @ARGV
perldoc perlfaq 查看关于Perl的经常被问到的问题及答案
perldoc perlop 查看Perl的操作符及优先级
perldoc perlsyn 查看Perl的的语法结构
perldoc perldiag 查看警告和错误相关的内容
perldoc perlvar 查看与变量相关的内容
.内容读写
1 输入输出
使用
输入输出整个过程有五部分:
open函数打开文件
像IN/OU这种叫做文件句柄(Perl中处理进程与用户交互的名称,IN说明用户让Perl输入某个文件)
【关于文件句柄:命名由字母、数字或者下划线组成,不能以数字开头,通常都是用大些字母命名;内置6个,STDIN、STDOUT、STDERR、DATA、ARGV、ARGVOUT】
逗号分隔【不能省略!】
引号部分是文件路径和名称
、 是输入、输出方向【一旦输入文件用了> 就会被清空】;而是追加,如果原文件不存在,就会创建一个新文件【和Linux重定向方式是一样的】
文件路径
上面的操作中,如果只有一个文件还好,如果有多个文件,那岂不是每次要修改 的参数?
因此使用就十分重要了!
存储的是命令行的参数,例如:
2 读取数据:主要靠句柄
命令行中输入结果就得到前三行内容
但是这样一个一个定义有些麻烦,尤其行数比较多的时候,因此可以用
命令行中输入 将读取行内容直接输入到out.fa中,不会打印到屏幕上
总结一下读写基本操作:首先使用open函数打开文件,然后while循环和句柄读入文件,并使用换行符,进行处理后将结果输出,最后关闭句柄
3 格式转换将fq转为fa:
区别两种格式:
fq格式有四行,fa文件只有两行(即不需要fq的第三行和第四行);
fq开头以开头,fa文件开头是
领取专属 10元无门槛券
私享最新 技术干货