懒惰也是一种美德

今天是生信星球陪你的第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文件开头是

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180720G1YBJK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券