为什么我的Perl for loop早退出?

1 perl for-loop

我试图让一个perl循环工作,从包含6个元素的数组.我希望循环从数组中拉出两个元素,执行某些函数,然后循环返回并从数组中拉出接下来的两个元素,直到数组耗尽元素.问题是循环只拉出前两个元素然后停止.这里的一些帮助会被大大提升.

my open(infile, 'dnadata.txt');
my @data = < infile>;
chomp @data;
#print @data; #Debug

my $aminoacids = 'ARNDCQEGHILKMFPSTWYV';
my $aalen = length($aminoacids);

my $i=0;
my $j=0;
my @matrix =();
for(my $i=0; $i<2; $i++){
    for( my $j=0; $j<$aalen; $j++){
    $matrix[$i][$j] = 0;

    }
}
Run Code Online (Sandbox Code Playgroud)

该计划的指导原则指出,该计划应忽略计划中存在的差距.这意味着应该忽略与间隙匹配的DNA代码.因此,推送的代码需要具有与删除的间隙相关联的对齐.

我需要将数组的长度修改为2,因为我在循环的这部分中比较了两个序列.

#$lemseqcomp = $lenarray / 2;
#print $lenseqcomp;
#I need to initialize these saclar values.
$junk1 = " ";
$junk2 = " ";
$seq1 = " ";
$seq2 = " ";
Run Code Online (Sandbox Code Playgroud)

这是导致问题的循环.我相信第一个循环应该移回到数组并在每次循环时拉出下一个元素,但事实并非如此.

for($i=0; $i<$lenarray; $i++){

    #This code should remove the the last value of the array once and 
    #then a second time. The sequences should be the same length at this point. 
my $last1 =pop(@data1);
my $last2 =pop(@data1);
for($i=0; $i<length($last1); $i++){
my $letter1 = substr($last1, $i, 1);
my $letter2 = substr($last2, $i, 1);
    if(($letter1 eq '-')|| ($letter2 eq '-')){ 
    #I need to put the sequences I am getting rid of somewhere. Here is a good place as any. 
    $junk1 = $letter1 . $junk1;
    $junk2 = $letter1 . $junk2;
    }
    else{
    $seq1 = $letter1 . $seq1;
    $seq2 = $letter2 . $seq2;

    }   
}
}
print "$seq1\n";
print "$seq2\n";
print "@data1\n";
Run Code Online (Sandbox Code Playgroud)

我实际上是尝试从头开始创建一个替换矩阵并返回数据.代码看起来很奇怪的原因是因为它实际上还没有完成而我卡住了.如果有人好奇,这是测试序列.

YFRFR
YF-FR
FRFRFR
ARFRFR
YFYFR-F
YFRFRYF
Run Code Online (Sandbox Code Playgroud)

dna*_*irl 7

首先,如果您要使用序列数据,请使用BioPerl.生活将变得如此简单.然而...

既然您知道要将输入文件中的行作为成对进行比较,那么将它们读入反映该数据结构的数据结构是有意义的.正如其他人所建议的那样,数组@data[[line1, line2],[line3,line4])确保正确的线对始终在一起.

我不清楚你要做的是:

  • a)您是否正在生成共有序列,其中2个序列仅由间隙差异
  • b)你的2个序列是否有显着差异,你是否试图排除不对齐部分然后产生共识?

那么,第一对是代表您的数据,还是更像第二对?

ATCG---AAActctgGGGGG--taGC
ATCGcccAAActctgGGGGGTTtaGC

ATCG---AAActctgGGGGG--taGCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
ATCGcccAAActctgGGGGGTTtaGCGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
Run Code Online (Sandbox Code Playgroud)


cha*_*aos 6

问题是你$i用作循环的计数器变量,所以内循环修改了外循环下的计数器.尝试将内循环的计数器更改为$j,或使用my它们正确地进行本地化.