感谢读者的指正,我以前写的一个程序是错的,从算法设计上就错了!
http://www.bio-info-trainee.com/926.html
我从新设计了一个算法,经过再三检查,我可以确信它是对的,至于是否高效,就不敢保证了,也希望有更多热心的读者帮助我改正,或者跟我讨论,请直接联系我的邮箱jmzeng1314 at(防爬虫) 163.com
代码如下:
while(<DATA>){chomp;@F=split/:/;$hash{$F[0]}=uc $F[1];} ##这里记录简并碱基的对应关系## %hash stored the tables;sub primer2multiple{$primer=$_[0];$prod=1;$primer_len=length $primer ;foreach $i (0..$primer_len-1){$char=substr($primer,$i,1);#$prod*=length $hash{$char} if ($char !~/[ATCG]/) ;if ($char !~/[ATCG]/) {push @pos_list,$i;push @char_list,$hash{$char};##首先找出所有的不是ATCG的碱基位置以及它对应的碱基## record all of the positions which are not ATCG;}}@out_list=($primer);##循环处理每个不是ATCG的碱基位置,让它们根据对应关系扩展foreach my $i (0..scalar(@pos_list)-1){@out_list=&new_out_list(\@out_list,$pos_list[$i],$char_list[$i]);} ##&new_out_list 这个函数非常重要,会把数组不停的扩展,最终达到应该有的个数!print join"\n",@out_list;print "\n";}sub new_out_list{my @array = @{$_[0]};my $pos = $_[1];my $char = $_[2];my @new_array=();foreach my $i (@array){foreach my $j (0..length($char)-1){substr($i,$pos,1,substr($char,$j,1));push @new_array,$i;}}return(@new_array);}primer2multiple('ATGCVCGCDCTNCCTGAB');__DATA__R:agY:CTM:ACK:GTS:gcW:ATH:atcB:gtcV:gacD:GATN:ATgc
Pingback: 用perl把含有简并碱基的引物序列还原成多条序列 | 生信菜鸟团