perl,读取所需文件的路径,然后打开相应的文件,并对文件中的DNA序列进行计数,substr函数对长字符串的片段化处理功能
2012-09-25 09:05
651 查看
以下是DNA序列,存储在window下F:\perl\data.txt里面:
下面是程序:
下面是运行的结果:
大家可能观察到有一个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。这样才能够满足我们的需求。
下面我们把修改过的代码写下:
得到的结果如下:
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 读取所需文件的路径,然后打开相应的文件
- perl应用:DNA序列翻译(下):从fasta格式中读取序列,然后输出蛋白质序列,以及fasta格式的介绍
- Python3基础 os.path.basename 对一个路径字符串进行处理 返回 文件的名字
- perl从文件中读取数据,然后输出,附一个蛋白质序列的读取
- AB程序核心代码(MFC从文件读取一行+MFC字符串处理+C在文件末尾追加内容)
- Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能
- Java读取文件时中文路径处理
- 利用pandas进行大文件计数处理
- Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能
- C++从配置文件读取路径,然后在程序中使用的方法
- perl 处理文件路径的一些模块
- 打开某个特定的url并进行返回相应的字符串
- 在JavaScript中进行文件处理,第二部分:文件读取
- 第二周第三天([输入一个字符串,然后输出字符串的运算结果] [object][异常][IO流,读取D盘某个文件])
- Perl打开读取文件
- 建立一个存储和处理字符串的类DelCharStr。构造函数:动态申请存储字符串所需内存空间,并且即能用指定的字符串也能用默认的值0为所声明的对象进行初始化。
- 在Mac版IDEA中选中一个文件然后在文件路径中打开以及IDEA中设置快捷键
- PHP 处理TXT文件(打开/关闭/检查/读取)
- 从ini格式文件中(没行是“键=值”格式)中读取配置项的值,Split字符串的处理(综合)
- MATLAB处理txt文本文件---数据格式要有规律性,否则要用编写特定方式进行读取