当前位置 博文首页 > perl 读取所需文件的路径,然后打开相应的文件

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

    作者:admin 时间:2021-02-06 15:17

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

    js
下一篇:没有了