我有以下代码:
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
声明......你知道为什么吗?
感谢。
答案 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是恶魔的作品......