我有一个问题困扰我很多... 我有一个包含两列的文件(感谢您在上一个问题中的帮助),例如:
14430001 0.040
14430002 0.000
14430003 0.990
14430004 1.000
14430005 0.050
14430006 0.490
....................
第一列是坐标第二概率。 我试图找到概率> gt = 0.990并且大小超过100的块。 作为输出,我希望如下:
14430001 14430250
14431100 14431328
18750003 18750345
.......................
其中第一列具有每个块的开始坐标,第二列具有其结束的坐标。
我写了这个剧本:
use strict;
#use warnings;
use POSIX;
my $scores_file = $ARGV[0];
#finds the highly conserved subsequences
open my $scores_info, $scores_file or die "Could not open $scores_file: $!";
#open(my $fh, '>', $coords_file) or die;
my $count = 0;
my $cons = "";
my $newcons = "";
while( my $sline = <$scores_info>) {
my @data = split('\t', $sline);
my $coord = $data[0];
my $prob = $data[1];
if ($data[1] >= 0.990) {
#$cons = "$cons + '\n' + $sline + '\n'";
$cons = join("\n", $cons, $sline);
# print $cons;
$count++;
if($count >= 100) {
$newcons = join("\n", $newcons, $cons);
my @array = split /'\n'/, $newcons;
print @array;
}
}
else {
$cons = "";
$count = 0;
}
}
它给了我概率&gt; = 0.990的线(第一个如果有效),但坐标是错误的。当我试图将它打印在一个文件中它堆叠时,所以我只有一个样本来检查它。 如果我的解释没有帮助,我很难过,但我是编程新手。
拜托,我需要你的帮助...... 非常感谢你提前!!!
答案 0 :(得分:2)
您似乎使用了太多变量。此外,在拆分数组并将其部分分配给变量之后,请使用新变量而不是原始数组。
sub output {
my ($from, $to) = @_;
print "$from\t$to\n";
}
my $threshold = 0.980; # Or is it 0.990?
my $count = 0;
my ($start, $last);
while (my $sline = <$scores_info>) {
my ($coord, $prob) = split /\t/, $sline;
if ($prob >= $threshold) {
$count++;
defined $start or $start = $coord;
$last = $coord;
} else {
output($start, $last) if $count > 100;
undef $start;
$count = 0;
}
}
output($start, $last) if $count > 100;
(未测试的)