-1
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw(min max);
use Set::IntervalTree;
use GenomeLookupUtil;

my $chromCol = 0;
my $startCol = 0;
my $endCol   = 0;
if($ARGV[2] eq "VSC") {
    $chromCol = 0;
    $startCol = 1;
    $endCol   = 2;
} else {
    $chromCol = 1;
    $startCol = 2;
    $endCol   = 3;
}

open (IN2,"$ARGV[0]") || die "counldn't open";
print STDERR "Read mask file \n";
my @masklines   = ();
my $i           = 0;
my %mask_hash   = ();
my $current_chr = '01';
my $current_snp_ranges = Set::IntervalTree->new();
while (<IN2>){
    my @masklines = split ("\t", $_);
    if ($masklines[1] ne $current_chr) {
            $mask_hash{$current_chr} = $current_snp_ranges;
            $current_snp_ranges = Set::IntervalTree->new();
    }

    $current_chr = $masklines[$chromCol];
    $current_snp_ranges->insert(
        [ $masklines[$startCol], $masklines[$endCol] ],
          $masklines[$startCol], 
          $masklines[$endCol]
    );
}
$mask_hash{$current_chr} = $current_snp_ranges;
close (IN2);

ファイルである不要な引数を含むコードを実行しているとき、エラーが次のように表示されます

Use of uninitialized value in subroutine entry at mytest.pl line 47, <IN2> line 100.

すべての変数を初期化しましたが、コードでもサブルーチンを使用していません。47行目は

$current_snp_ranges->insert(
      [ $masklines[$startCol], $masklines[$endCol] ],
        $masklines[$startCol], 
        $masklines[$endCol]
);
4

1 に答える 1

2

mytest.pl 行 47、行 100 のサブルーチン エントリの初期化されていない値は、前の 99 行の入力データが OK であったことを示しています。では、入力データの 100 行目は何ですか? おそらくファイルの最後にある空白行でしょうか?

コードの前半ではmy @masklines=split ("\t",$_);、配列から値を抽出する行 47 の試行をサポートするのに十分なデータを配列が受信したことを確認していません。おそらく、100 行目のタブ区切りフィールドは予想よりも少ないでしょう。

次のようなコードを追加することをお勧めしますmy @masklines=split ("\t",$_);

if ( $#masklines < $endCol ) {
    print "Too few fields in line: $_";
}
else {
    ... the rest of the code within the while statement
}

更新: 質問は、エラーが発生したのは 1 行のみであることを示唆するように記述されていました。ただし、分割が必要な数のフィールドを抽出することのチェックはありません。不正な入力データをチェックする防御コードを作成することをお勧めします。問題を見つけやすくするために、次のような一連の print ステートメントを 47 行目の前に追加してみてください。

print "startcol $startCol\n";
print "endcol $endCol\n";
print "masklines-startCol $masklines[$startCol]\n";
print "masklines-endCol $masklines[$endCol]\n";

それらを別々の行にすると、初期化されていない変数が単純な行に表示され、問題の原因を理解するのに役立ちます。

于 2013-05-07T14:28:07.830 に答える