反思从昨天到今天一来遇到的问题,让我苦思许久的问题,就在不经意之间得到了解决。
当我们遇到一个问题的时候,什么才是解决之道呢?
凡是我们遇到问题,既然是问题,一定有问题的构成要素,我们要做的就是把问题中的所有关键内容进行提取,或者不断的对问题进行各个方面的更加详细的搜集信息。让问题得到更加全面的描述。当描述的越全面的时候,我们的解就越来越明显。
所以我们在面对问题的时候沉静下来,思考问题,才是思考答案。
我们来看一下,前面我的博文在回对全部序列的时候,总是有一部分,不能够匹配。
这是个大的问题,但是对于这个问题的分析,
我们排序以后,发现sample1是完全可以回对的,没有问题,
以后的每一个sample 都有问题。但是后面处理剩余样品的每一段程序都是一样的。
每一个sample的结果都是在开始很长的一段无法匹配,但是到了后面又都能够回对上。
就这样,我们把问题 一个个的解析,就会发现问题出现在开始的部分。
第一部分是正常的,那一定是第一部分的改变,对于后面有了不同的影响。所以才会使后面的程序出现问题。
open (DNA,"Chr5_join.txt")||die("can not open");
while(<DNA>)
{
@information1=split;
$position{$information1[0]}{sample0}=$information1[1];
}
open (DNA1,"TAIR_vs_bur.maf")||die("can not open");
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$z=<DNA1>;
$/="\n\n"; #其实问题就出现在这里,我们把系统的默认的换行符给改变了,现在我们认为只有两个换行符才是一行。
while(<DNA1>)
{
@mout = split/\n/,$_;
@score= split/=/, $mout[0];
unless ($score[1]<90000)
{
@info1 = split/\s+/,$mout[1];
@info2 = split/\s+/,$mout[2];
@sequen1 = split// ,$info1[6];
@sequen2 = split// ,$info2[6];
for($cout1=$info1[2]+1;$cout1<$info1[3]+$info1[2]+1;$cout1++)
{
if(exists $position{$cout1})
{
$cout=$cout1-$info1[2]-1;
$position{$cout1}{sample1}=$sequen2[$cout];
}
else
{
next;
}
}
}
}
open (DNA2,"TAIR_vs_can.maf")||die("can not open");
$z=<DNA2>; #但是这里我们使读取的默认的一行,还是改编后的一行呢?很显然,我们依然认为这里应该读取一个换行符的一行,但是我们却忘记了我们已经把默认的换行符给改变了,这里真实读取的其实不是一行了,而是很长的一段,这一段的结尾包含着两个换行符。这就是问题的症结所在。我们要做的就是在这一行前面把换行符给给改过来,$/="\n";
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$z=<DNA2>;
$/="\n\n";
while(<DNA2>)
{
@mout = split/\n/,$_;
@score= split/=/, $mout[0];
unless ($score[1]<90000)
{
@info1 = split/\s+/,$mout[1];
@info2 = split/\s+/,$mout[2];
@sequen1 = split// ,$info1[6];
@sequen2 = split// ,$info2[6];
for($cout1=$info1[2]+1;$cout1<$info1[3]+$info1[2]+1;$cout1++)
{
if(exists $position{$cout1})
{
$cout=$cout1-$info1[2]-1;
$position{$cout1}{sample2}=$sequen2[$cout];
}
else
{
next;
}
}
}
}