Perl:$ i的子程序抛出错误

时间:2014-07-01 10:11:52

标签: perl

早上好, 我在使用子程序时遇到了麻烦 - 如果我将某些代码放入子程序中,它会引发错误"在数组元素中使用未初始化的值$ i"。

我的脚本非常长,所以我只发布我认为相关的位。

我调用的子程序在& exon_positive_strand下面被注释掉(保存向下滚动)。当我删除子程序并取消注释代码时,我没有错误。我只能想象它与$ i有关,但我不知道是什么......

任何建议都将不胜感激。 非常感谢, 埃利

my ($value, $col, $col2, $l_o_b, $left, $matchedID, $diff_three_prime, $diff_five_prime, $sequence, @three_prime_ss, @five_prime_ss, @reverse_five, @reverse_three);
my $i = 0;
open (EXONS_five, '>fasta_exons_five_non');
open (EXONS_three, '>fasta_exons_three_non');
foreach my $match(@exonic_matches) { ## works out exon from boundary relative to correct strand direction ##

if ($exon_ID[$i] !~ m/unknown/ && $dupmatches[$i] == 0)
{

$sequence = '';
$value = $exon_ID[$i];
$col = $exon_left{$value};
$col2 = $exon_right{$value};
@three_prime_ss = split(",", $col); ##splits left column into subcolumns 
@five_prime_ss = split(",", $col2); ## splits right columnn into subcolumns
@reverse_three = reverse(@three_prime_ss);
@reverse_five = reverse(@five_prime_ss);
shift(@reverse_five);

if ($strands{$value} =~ m/\+/) {

&exon_positive_strand;

# $diff_three_prime = $LBP[$i] - $three_prime_ss[$exons2{$value} - 1]; ## minus numbers denote a difference to the left (i.e. upsteam)
# $diff_five_prime = $LBP[$i] - $five_prime_ss[$exons2{$value} - 1]; ## minus numbers denote a difference to the left (i.e. upsteam)
# $matchedID = $ID{$LBP[$i]};

# if ($diff_three_prime !~ m/\-/ && $diff_three_prime <= 3) {

# $BP{$LBP[$i]} =~ s/\[[ACTG]\]/$ref[$i]/i; ## putting variant into 50BP seq

# $l_o_b = 20;
# ##$right_of_boundary = 3;

        # $l_o_b = $l_o_b + $diff_three_prime; 

        # $left = 51 - $l_o_b; 

# $sequence = substr($BP{$LBP[$i]}, $left, 23);
# }

# elsif ($diff_five_prime =~ m/\-/ && $diff_five_prime >= -3) {

# $BP{$LBP[$i]} =~ s/\[[ACTG]\]/$ref[$i]/i; ## putting variant into 50BP seq

# $l_o_b = 3;
# ##$right_of_boundary = 6;

        # $l_o_b = $l_o_b + $diff_five_prime; 

        # $left = 51 - $l_o_b; 

# $sequence = substr( $BP{$LBP[$i]}, $left, 9);
    }
 }

my $seq_length = length($sequence);

if ($seq_length == 9) {

print EXONS_five (">" . "$match_exon{$col_exon_no[$i]}" . "\n", lc($sequence),"\n");    
}
    elsif ($seq_length == 23) {
print EXONS_three (">" . "$match_exon{$col_exon_no[$i]}" . "\n", lc($sequence),"\n");
}
$i++;
}
close (EXONS_five);
close (EXONS_three);

2 个答案:

答案 0 :(得分:2)

&#34;在数组元素中使用未初始化的值&#34;这不是一个错误,它是一个警告。 Diagnostics可以告诉你这意味着什么:

  

(W未初始化)使用未定义的值,就像它已经存在一样       定义。它被解释为&#34;&#34;或者是0,但也许这是一个错误。       要禁止此警告,请为变量分配定义的值。

     

为了帮助您弄清楚未定义的内容,perl将尝试告诉您       未定义的变量名称(如果有)。在某些情况下,它不能       这样做,所以它也告诉你使用未定义值的操作       但请注意,perl会优化您的程序和操作       显示在警告中可能不一定会出现在您的警告中       程序。例如,&#34;那个$ foo&#34;通常被优化为&#34;&#34;       。 $ foo,警告将引用连接(。)运算符,       即使没有。在你的程序中。

答案 1 :(得分:1)

您需要将$i变量传递给子例程:

exon_positive_strand($i);

sub exon_positive_strand {
    my $i = shift;
    ...