if / else在Perl中不起作用

时间:2014-05-15 13:11:56

标签: perl if-statement

我有以下代码:

if ($strand_hit eq "-" and $strand_key ne "+") {
    $upstream_exonic_antisense{$key} = $hit;
}
elsif ($strand_hit eq "-" and $strand_key eq "-") {
    $upstream_exonic_sense{$key} = $hit;
    print "hola\n";
                    }
elsif ($strand_hit eq "-" and $strand_key eq ".") {
    $upstream_exonic_unknown{$key} = $hit;
}
elsif ($strand_hit eq "+" and $strand_key ne "-") {
    $downstream_exonic_antisense{$key} = $hit;
}
elsif ($strand_hit eq "+" and $strand_key eq "+") {
    $downstream_exonic_sense{$key} = $hit;
    print "hola\n";
}
elsif ($strand_hit eq "+" and $strand_key eq ".") {
    $downstream_exonic_unknown{$key} = $hit;
}
elsif ($strand_hit eq ".") {
    $updown_exonic_unknown{$key} = $hit;
}
else {
    print $strand_key.$strand_hit."\n";
    next;
}

变量$strand_hit$strand_key可以是+-.。然而,elsif(s)不起作用,所有内容都转到else声明......你知道为什么吗?

感谢。

3 个答案:

答案 0 :(得分:2)

有一个或两个变量的问题与您的想法不完全相同(例如,在最后有一个换行符),或者代码没有出现才能正常工作因为它是错误的:如果if条件为真,则第一个和第二个elsif条件也将为真,但永远不会达到,因为将采用if分支。同样,如果第三个elsif条件为真,则第四个和第五个elsif分支将永远不会被采用。你能用英语描述一下你希望你的代码做什么吗?

答案 1 :(得分:2)

如前所述,您的变量很可能包含诸如返回字符之类的工件。始终通过在这种情况下将变量打印到控制台来调试代码。 print "'$var'\n";

我还想向您介绍这种if / else情况的另一种方法。您可以创建一个调度表,该表包含要根据您要比较的值执行的匿名子例程。当您正在使用的代码特别简单,只需很长时间时,这可能是一个有用的构造。

my %dispatch_table = (
    '-' => {
        '+' => sub { $upstream_exonic_antisense{$key} = $hit; },
        '-' => sub { $upstream_exonic_sense{$key} = $hit; print "hola\n"; },
        '.' => sub { $upstream_exonic_unknown{$key} = $hit; },
        },
    '+' => {
        '-' => sub { $downstream_exonic_antisense{$key} = $hit; },
        '+' => sub { $downstream_exonic_sense{$key} = $hit; print "hola\n"; },
        '.' => sub { $downstream_exonic_unknown{$key} = $hit; },
        },
    );

if (my $sub = $dispatch_table{$strand_hit}{$strand_key}) {
    $sub->();
} 
elsif ($strand_hit eq ".") {
    $updown_exonic_unknown{$key} = $hit;
}
else {
    warn "strand_key = '$strand_key', strand_hit = '$strand_hit'\n";
    next;
}

请注意我如何用单引号括起else调试消息,以确保您可以查看变量中是否存在任何伪影间距。

答案 2 :(得分:0)

除了您没有选择输入数据的可能性之外,在第一次测试中,第二个和第三个elsifs无法执行。我怀疑其余的测试同样存在缺陷。

重构:

if ($strand_hit eq "-") {
  if ($strand_key ne "+") { # should this be eq ??
     $upstream_exonic_antisense{$key} = $hit;
  } elsif ($strand_key eq "-") {
     $upstream_exonic_sense{$key} = $hit;
     print "hola\n";
  } elsif ($strand_key eq ".") {
      $upstream_exonic_unknown{$key} = $hit;
  }
} elsif ($strand_hit eq "+") {
  if ($strand_key ne "-") { # should this be eq?
     $downstream_exonic_antisense{$key} = $hit;
  } elsif ($strand_key eq "+") {
     $downstream_exonic_sense{$key} = $hit;
     print "hola\n";
  } elsif ($strand_key eq ".") {
     $downstream_exonic_unknown{$key} = $hit;
  }
}  elsif ($strand_hit eq ".") {
  $updown_exonic_unknown{$key} = $hit;
} else {
   print $strand_key.$strand_hit."\n";
   next;
}

让我们暂时假设$ strand_hit eq' - '。 如果$ strand_key eq'+'将不执行上述if语句。将对$ strand_key

的所有其他值执行第一个语句

现在假设$ strand_hit eq' - '。 if elses块中的第一个语句是唯一可以再次执行的语句。

我建议你将这两个值加在一起,并为两个字符串添加if个语句。它会更容易阅读。多个elsifs with和clauses是恶魔的作品......