【发布时间】:2012-03-29 10:36:44
【问题描述】:
我正在处理一个文件(fasta 文件),这是格式-
>chr1 AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGC CAAACCCCAAAAAAAAAAGAACCCTAACACCAGCCTAACCAGATTTCAAAT TTTTATCTTTAGGCGGTATGCACTTTTAACAAAAAAANNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN GCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCATACCCCGAAC CAACCAAACCCCAAAGACACCCCCCACAGTTTATGTAGCTTACCTCNNNN >chrM GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCAT TTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTG GAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATT CTATTATTTATCGCACCTACGTTCAATATACAGGCGAACATACCCACTA AAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTGAAT GTCTGCACAGCCGCTTTCCACACAGACATAACAAAANAATTTCCACC我想使用滑动窗口方法(非重叠窗口,大小 = 50)。我想在 50bp 窗口中找到每个字符的坐标,但不包括 N。第一个 chr1 的输出应该是->
chr1 0 50 chr1 50 100 chr1 100 215 chr1 215 265代码是-
use warnings;
*ARGV or die "No input file specified";
open *first, '<',$ARGV[0] or die "Unable to open input file: $!";
$start=1;
while(<first>) {
chomp;
if ( /(>)(\w)/ ) { #taking lines which have name of chromosome
@arr=split(">"); #splitting at ">" character and in $arr[1], there is chr name now
if (defined @array){
foreach (@array){
$length++;
if($_ ne N){
$non++;
if ($non == 50){
print $chr,"\t",$start,"\t",$length,"\n";
$start=$length;
$non=0;
}
}
}
}
undef @array;
$length=0;
$non=0;
$start=0;
}
else {
@count=split(//, $_); #splitting each character in line
push(@array,@count); #storing each character in array till we find next chromosome
$chr=$arr[1];
}
}
foreach (@array){
$length++;
if($_ ne N){
$non++;
if ($non == 50){
print $chr,"\t",$start,"\t",$length,"\n";
$start=$length;
$non=0;
}
}
}
问题是我的 fasta 文件很大,这段代码占用了大量内存和时间。您能否提出建议,如何使用更少的内存使其更快。
谢谢
【问题讨论】:
-
这不是您的问题的答案,但它会帮助您清理一下您的脚本。如果您遵循
strict杂注并声明所有新变量,例如@array、$length、$non和$start,使用my,它们将自动跳出范围而您不会必须保持undefing 并重置它们。 -
感谢您的建议。我在开始时尝试使用我的和使用严格的,当我必须在其他循环中打印该变量时,它会显示错误(使用未初始化的......)。所以我跳过了 use strict 部分。
-
最后那个 foreach 到底在做什么?看起来只是重复的代码......
-
@vikas:如果它说您使用的是未初始化的变量,请不要禁用
strict,修复您的代码!使用strict是为了帮助你调试;如果您无视此功能,请不要在编译器告诉您代码损坏时寻求有关损坏代码的帮助。 -
您可以在
use strict; use warnings;之后使用no warnings "uninitialized";这意味着您可以在没有其他警告的情况下获得软件的所有其他好处,其他人也抱怨过这些警告。
标签: perl sliding-window