perl读取所需文件的路径

发布时间:2020-02-09编辑:脚本学堂
perl读取所需文件的路径,然后打开相应的文件,并对文件中的DNA序列进行计数,substr函数对长字符串的片段化处理功能。

perl读取所需文件的路径,然后打开相应的文件,并对文件中的DNA序列进行计数,substr函数对长字符串的片段化处理功能。

以下是DNA序列,存储在window下F:perldata.txt里面:
AAAAAAAAAAAAAAGGGGGGGTTTTCCCCCCCC  
CCCCCGTCGTAGTAAAGTATGCAGTAGCVG  
CCCCCCCCCCGGGGGGGGAAAAAAAAAAAAAAATTTTTTAT  
AAACG  

下面是程序:
 

复制代码 代码如下:
   #下面的程序是用来计算一段DNA序列中ATGC的数量的 
     
    #首先定义四种碱基的数量为0 
    $count_A=0; 
    $count_T=0; 
    $count_C=0; 
    $count_G=0; 
    #首先要先把序列进行合并成一行 
     
    #先确定所要处理的文件的路径及文件名(在windows系统下面要按照这样的例子写 
    #f:perldata.txt 
    print "please input the Path just like this f:\perl\data.txtn"; 
    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 "errorn" 
        } 
    } 
    #输出最后的结果 
    print "A=$count_An"; 
    print "T=$count_Tn"; 
    print "C=$count_Cn"; 
    print "G=$count_Gn";

运行的结果:
    F:>perla.pl 
    please input the Path just like this f:perldata.txt 
    f:perldata.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:perldata.txt 
    print "please input the Path just like this f:\perl\data.txtn"; 
    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 "errorn" 
        } 
    } 
    #输出最后的结果 
    print "A=$count_An"; 
    print "T=$count_Tn"; 
    print "C=$count_Cn"; 
    print "G=$count_Gn"; 

得到的结果如下:
    F:>perla.pl 
    please input the Path just like this f:perldata.txt 
    f:perldata.txt 
    error 
    A=40 
    T=17 
    C=27 
    G=24 
     
    F:>