-1

非常に気になる問題があります...次のような2つの列を持つファイルがあります(前の質問での助けに感謝します):

14430001        0.040
14430002        0.000
14430003        0.990
14430004        1.000
14430005        0.050
14430006        0.490
....................

最初の列は 2 番目の確率の座標です。確率が 0.990 以上で、サイズが 100 を超えるブロックを見つけようとしています。出力として、私は次のようになりたいです:

14430001        14430250
14431100        14431328
18750003        18750345
.......................

ここで、最初の列には各ブロックの開始点の座標があり、2 番目の列にはブロックの終了点があります。

私はこのスクリプトを書きました:

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;
   }

}

それは私に確率 >=0.990 (最初の場合) の行を与えますが、座標は間違っています。ファイルに印刷しようとするとスタックするため、確認するサンプルは1つだけです。私の説明が役に立たなかったら大変申し訳ありませんが、私はプログラミングが初めてです。

どうか、あなたの助けが必要です... よろしくお願いします!!!

4

1 に答える 1

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;

(未テスト)

于 2013-08-25T23:16:46.220 に答える