暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

带你看懂perl(二)

自动化测试日记 2019-11-18
769

    第一篇简单地介绍了一下三种数据类型相对来说比较重要,大家弄懂了基本上看脚本就不会很吃力了。需要补充一点,变量与变量直接也可以赋值,数组里面也能存变量,哈希一样例如:

my $name='小明';

my $tmp=name;   #那么这个name变量中的小明也赋值给tmp了 等价于#tmp ='小明'

my @arr;

$arr[0]=name;       #等价于 arr[0]='小明'

my %hash();

$hash{name}=18;  #等价于$hash{'小明'}=18

这里应该不难,当然变量,数组,哈希的表达方法还有很多种,想要详细了解还得查详细的资料。



    单看我介绍可能还是有点懵,所以下面结合生信常见的一小段代码拿来讲解,看完之后我相信大家自己也可以写一个读取文件的内容。


use strict;

use warnings;


my $followFile="time.txt";

my $expFile="ARGexp.txt";

my $sampleFile="all";

my $geneFile="all";


my %geneHash=();


open(RF,"$geneFile") or die $!;

while(my $line=<RF>)

{

chomp($line);

$geneHash{$line}=1;

}

close(RF);


    大家是不是有种似曾相识的感觉,当大家拿到一份代码的时候大家其实不要慌,只要你能把每句话都能看懂知道它是干什么的其实就等于看小说一样.可能大家都会在想我没学过perl,我甚至没学过编程语言我肯定看不懂,这段代码就是个天书,如果你又这样的想法你就错了。如果你看过我第一篇文章,你还一点都看不懂那就是我的错。我要和读者真心地说一声对不起了,我要给大家一碗鸡汤,相信我跟着我走,看懂生信的perl代码真的不难(先自我吹一波

    言归正传,当我们看一份代码的时候,正确的做法是要从main函数开始读起但由于生信的脚本比较简单一般都不会涉及主函数和子函数的概念(我暂时没看过有这类的代码)所以大家可以大胆地从第一行读起(这是一个坏习惯最好还是瞄一眼确认脚本没有main())


接下来我们一句句分析,同类型的我会一起讲解,

use strict;

use warnings;

    这两句如果大家不想深究,可以忽略,一般情况下代码中你也可以把它去掉,了解一下即可。我这里也提一下,use strict其实我的理解是有时候代码过长了可能导致某些变量明明定义过了但还是报这个变量没定义的错误。use warnings就是打开一些告警,告诉你的代码哪些变量定义了但没赋值,没有使用等等。这里的use还可以引用第三方的模块,例如 use xml这个后面遇到我再解释一下。说到这里总结一句话:在大部分的代码中,它们是多余的!大家如果想写代码的时候还是建议复制粘贴到第一行,毕竟长得好看


my $followFile="time.txt";    #定义一个followFile变量内容为 time.txt

my $expFile="ARGexp.txt";  #定义一个expFile变量内容为 ARGexp.txt

my $sampleFile="all";          #定义一个sampleFile变量内容为 all

my $geneFile="all";             #定义一个geneFile变量内容为 all

my %geneHash=();              #定义一个空的哈希名字为geneHash

    不要想得太复杂,这段东西就是这么简单,不管谁看到这段都是这样,答案而且是唯一!看了第一篇的朋友现在也应该也要一眼就知道它代表的意义.如果你已经看懂,那证明你已经对perl的三个重要数据类型有区分的能力了。

    解释到这里,接下来就是今天的重点.在解释剩下的代码之前,我先给大家介绍几个重要的函数和一个控制语句while.

1.读取文件的open()函数,它必须要有两个参数,文件句柄与文件路径

文件句柄:我的理解就等于把某个文件起一个别称,名字叫什么你喜欢,一般情况下用大写,以后有写文件的时候需要用到。

文件路径:字面意思,文件存放的路径。

1)open(文件句柄,"文件名"):打开一个已经存在的文件,如果文件不存在则会报错并把错误信息返回$!中;

2)open(文件句柄,"+>文件名"):打开一个文件如果不存在则会自动创建,如果文件存在并有内容则会把内容删;

3)open(文件句柄,">>文件名"):打开一个已经存在的文件,内容会追加到文件的最后一行,如果文件不存在则会报错并把错误信息返回$!中。

    常见用法就三种,大家现在看到open的时候知道它表示打开一个文件就可以了,再看看是哪种方式打开基本就ok了!open(RF,"$geneFile") or die $!; 至于or die $!基本都是固定用法,大家记住就可以了,功能是打开一个文件如果不存在则把错误信息显示出来并终止程序。


2.控制语句while:

固定用法 :

while(条件){

你想操作的内容

}

    当条件成立的时候,会顺序执行{}里面的代码,再返回到while()这里再判断条件是否还成立.拿例子讲解:大家可能看到while(my $line=<RF>)又开始懵了.

    其实不要慌,无论怎么样while括号里面都是条件,那么我们可以拆分出来,条件就是 my $line=<RF>  这个大家就知道了吧 就是定义了一个变量去接收 <RF>;这里比较特殊由于RF是文件句柄所以可以直接这样赋值给 $line,而<RF>代表的是文件中的一行内容,第一次循环的时候它代表第一行,第二次循环的时候自动跳到第二行依次类推直到最后一行结束的时候返回一个空值(NULL)给$line。

    简单来说,就是当你文件存在3行内容就会循环3次,存在100行就会循环100次,一行都没有则不会执行{}里面的代码.


3.chomp()

    在我们文件中的内容默认每一行都有一个 \n(换行符号),肉眼看不到的. 刚刚说到$line是代表我们文件中的一行内容,所以chomp($line)就是去掉每一行的\n ,如:

a.txt

123

345

我们如果不加chomp($line)则为 123\n,加了则为123



4.close(RF)没别的意义就是当我们用open打开了哪些文件的时候,习惯上都需要在用完之后用close(RF)关闭文件。


    到这里这段代码大家应该知道每一行都是做什么了吧,总的来说就是给一堆变量赋值然后打开一个文件,把文件的每一行内容作为geneHash哈希的一个key,赋一个为1的值给它。到这里这段代码就读懂了。但是有人会想为什么$geneHash{$line}=1?定义来有什么用?为什么这里要加chomp($line);不加可以吗?因为这只是一部分的代码,这样做肯定之后的代码用到所以才这么写的。

    能读懂这段代码,其实大家就已经就具备了写一个读取文件内容perl脚本的能力了 !大家可以思考一下,就几行。答案可以公众号回复“perl001”查看。

    以上就是今天的内容,自己很少写文章,请大家多多包涵如果有疑问或错误的地方麻烦帮忙指出,如果觉得有收获可以帮忙分享给有需要的人或是给我点个赞,谢谢,我的目标只是带大家看懂perl,如果想深入了解的朋友还是需要看书本的介绍或自行百度查阅详细的解释哦!大家有什么建议或是想法都可以提出哦,如果我会我都会给大家分享出来。



文章转载自自动化测试日记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论