到目前为止,大家应该会读会写文件的基本操作了,接下两篇打算带大家真正搞懂第一个生信的完整脚本。曾经有人问过我一个名字叫addSymbol.pl的脚本相信很多人也应该用过但是我估计没几个人真正看懂它究竟是怎么实现的。如果之前的三篇都弄懂了,今天我再介绍几个简单的函数我相信大家就能看懂它的原理甚至能看懂50%的生信脚本。不是我在夸大,很多脚本的处理无非都是在这个的基础上变一变逻辑而已。
首先,介绍一个常用的判断语句if,用法十分简单,直接看例子。
if(判断条件){执行语句}elsif(判断条件){执行语句}elsif(判断条件){执行语句}else{执行语句}
不要问为什么长这样,我也不知道记就行了!如果我们的判断条件只有两种情况那我们可以省略elsif,直接用if...else..即可,elsif是根据有多少判断条件而去增加或减少。
if(判断条件){执行语句}else{执行语句}
举个例子让大家印象更容易理解一下吧,小明今天如果出太阳就晒衣服,阴天去打篮球,否则在家看电视。
my $weather;if($weather == 'sunny'){print "晒衣服";}elsif($weather == 'cloudy'){print '打篮球';}else{print '看电视';}
然后给大家隆重介绍一下分隔函数split();这个函数基本每一个脚本都会遇到,它的作用是根据自己的需要把一些字符串(数据的内容)按照我们指定的字符去切割并返回一个数组。如果有点难理解那就直接看例子。
格式:
@arr =split(“指定字符”,“需要切割的字符串”);@arr =split(/指定字符/,“需要切割的字符串”);
(一般情况下“ ”和//都可以通用,只有一些特殊的符号作为分隔符才可能需要//,这里不需要深究,个人习惯是用“ ”)
有一个字符串是TCGA-H21B-AFSD-123,我们需要以 ‘-’为分割符进行切割那么我们可以用
my @arr = split("-","TCGA-H21B-AFSD-123");my @arr = split(/-/,"TCGA-H21B-AFSD-123");
得到的@arr是一个数组,里面存放了四个字符串
$arr[0]='TCGA';$arr[1]='H21B';$arr[2]='AFSD';$arr[3]='123';
最后最介绍的是一个$. 和 exists,$.代表的是读文件的时候当前行号。完了就这一句话,很尴尬.那说说exists凑凑字数,exists一般用于判断哈希中是否存在这个key,不明白不要紧下次我在讲解代码的时候会和大家介绍
下面直接上代码了,大家可以先看看,下次作详细的介绍!
use strict;use warnings;my %hash=();open(RF,"ann.txt") or die $!;while(my $line=<RF>){chomp($line);my @arr=split(/\t/,$line);$hash{$arr[0]}=$arr[1];}close(RF);open(RF,"input.txt") or die $!;open(WF,">out.txt") or die $!;while(my $line=<RF>){chomp($line);if($.==1){print WF "$line\tSymbol\n";}my @arr=split(/\t/,$line);if(exists $hash{$arr[0]}){print WF "$line\t$hash{$arr[0]}\n";}elsif(exists $hash{$arr[11]}){print WF "$line\t$hash{$arr[11]}\n";}elsif(exists $hash{$arr[13]}){print WF "$line\t$hash{$arr[13]}\n";}else{}}close(WF);close(WF);
现在大家看这个代码,应该是不会完全看不懂了,至少能知道大概是怎么一个怎么样的逻辑。如果觉得看懂了大部分可以给我双击666!看不懂也没关系下次我一行行帮大家复习!




