-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 行输入数据是正常的。那么输入数据的第 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
}

更新:这个问题的措辞表明只有一行给出了错误。但是,没有检查拆分是否提取了所需数量的字段。编写检查错误输入数据的防御性代码是一种很好的做法。为了帮助找到问题,您可以尝试在第 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 回答