欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

perl 读取所需文件的路径,然后打开相应的文件

程序员文章站 2022-07-11 15:13:53
以下是dna序列,存储在window下f:\perl\data.txt里面:复制代码 代码如下:aaaaaaaaaaaaaagggggggttttcccccccc ...

以下是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:\>