perl 读取所需文件的路径,然后打开相应的文件
以下是dna序列,存储在window下f:\perl\data.txt里面:
aaaaaaaaaaaaaagggggggttttcccccccc
cccccgtcgtagtaaagtatgcagtagcvg
ccccccccccggggggggaaaaaaaaaaaaaaattttttat
aaacg
下面是程序:
#下面的程序是用来计算一段dna序列中atgc的数量的
#首先定义四种碱基的数量为0
$count_a=0;
$count_t=0;
$count_c=0;
$count_g=0;
#首先要先把序列进行合并成一行
#先确定所要处理的文件的路径及文件名(在windows系统下面要按照这样的例子写
#f:\\perl\\data.txt
print "please input the path just like this f:\\\\perl\\\\data.txt\n";
chomp($dna_filename=<stdin>);
#打开文件
open(dnafilename,$dna_filename)||die("can not open the file!");
#将文件赋予一个数组
@dna=<dnafilename>;
#以下两步要把所有的行合并成一行,然后去掉所有的空白符
$dna=join('',@dna);
$dna=~s/\s//g;
#将dna分解成,然后赋值到数组
@dna=split('',$dna);
#然后依次读取数组的元素,并对四种碱基的数量进行统计
foreach $base(@dna)
{
if ($base eq 'a')
{
$count_a=$count_a+1;
}
elsif ($base eq 't')
{
$count_t=$count_t+1;
}
elsif ($base eq 'c')
{
$count_c=$count_c+1;
}
elsif ($base eq 'g')
{
$count_g=$count_g+1;
}
else
{
print "error\n"
}
}
#输出最后的结果
print "a=$count_a\n";
print "t=$count_t\n";
print "c=$count_c\n";
print "g=$count_g\n";
下面是运行的结果:
f:\>perl\a.pl
please input the path just like this f:\\perl\\data.txt
f:\\perl\\data.txt
error
a=40
t=17
c=27
g=24
f:\>
大家可能观察到有一个error的出现,这是为什么呢?
大家仔细看一看最上面的原始 dna序列,用特殊颜色标记的,可以看到有一个v,所以会输出错误。
这里把dna序列经过整合成一行,然后去除所有的空白字符以后,又把$dna通过split函数变成了数组,然后进行统计,那有没有更好的办法呢?
其实perl里有一个函数,substr。
我们先来看一看这个函数的用法,substr是针对一个大字符串的操作符(the substr function works with only a part of a larger string )言外之意就是对一个很长的字符串,进行片段化处理,取其中的一部分。我们这里用到的就是这个特性。
$little_string =substr($large_string,$start_position,$length)
$小片段=substr($大片段,$你要截取的小片段的起始位置,$你要截取的长度)
我们这里为了统计dna中各种碱基的数量,所以要处理的字符串是一个碱基,所以我们要把$length设置为1。这样才能够满足我们的需求。
下面我们把修改过的代码写下:
#下面的程序是用来计算一段dna序列中atgc的数量的
#首先定义四种碱基的数量为0
$count_a=0;
$count_t=0;
$count_c=0;
$count_g=0;
#首先要先把序列进行合并成一行
#先确定所要处理的文件的路径及文件名(在windows系统下面要按照这样的例子写
#f:\\perl\\data.txt
print "please input the path just like this f:\\\\perl\\\\data.txt\n";
chomp($dna_filename=<stdin>);
#打开文件
open(dnafilename,$dna_filename)||die("can not open the file!");
#将文件赋予一个数组
@dna=<dnafilename>;
#以下两步要把所有的行合并成一行,然后去掉所有的空白符
$dna=join('',@dna);
$dna=~s/\s//g;
#然后依次读取字符串的元素,并对四种碱基的数量进行统计
for ($position=0;$position<length $dna;++$position)
{
$base=substr($dna,$position,1);
if ($base eq 'a')
{
$count_a=$count_a+1;
}
elsif ($base eq 't')
{
$count_t=$count_t+1;
}
elsif ($base eq 'c')
{
$count_c=$count_c+1;
}
elsif ($base eq 'g')
{
$count_g=$count_g+1;
}
else
{
print "error\n"
}
}
#输出最后的结果
print "a=$count_a\n";
print "t=$count_t\n";
print "c=$count_c\n";
print "g=$count_g\n";
得到的结果如下:
f:\>perl\a.pl
please input the path just like this f:\\perl\\data.txt
f:\\perl\\data.txt
error
a=40
t=17
c=27
g=24
f:\>
上一篇: Perl学习教程之单行命令详解