早上好, 我在使用子程序时遇到了麻烦 - 如果我将某些代码放入子程序中,它会引发错误"在数组元素中使用未初始化的值$ 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);
答案 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;
...