我的Perl脚本中的if-elsif-else阻塞有什么问题?

时间:2010-09-10 09:32:03

标签: perl if-statement boolean-expression

我正在尝试为嵌套的if语句编写一个条件,但是没有找到使用if语句的好例子。以下elsif条件失败,并允许嵌套在其下的代码触发$status == 6

if ($dt1 > $dt2 ) {do one thing}
elsif(($status != 3) || ($status != 6)) { do something else}
else {do something completely different}

我想避免为每个条件设置另一个elsif,因为实际驻留在这里的代码是几行。

3 个答案:

答案 0 :(得分:8)

您的逻辑错误,您的elseif块将始终返回true。我认为你的意思是使用AND而不是OR。给出以下代码段

foreach $status (1 .. 10) {
   if (($status != 3) && ($status != 6)) {
      print "$status => if\n";
   } else {
      print "$status => else\n";
   }
}

这将输出

1 => if
2 => if
3 => else
4 => if
5 => if
6 => else
7 => if
8 => if
9 => if
10 => if

如果它有助于你的思考,那就是条件!某事|| !somethingElse总是可以改写为!(某事&& somethingElse)。如果你把它应用到上面的情况你会说!(3&& 6),并且看到一个数字不能同时是3和6,它总是假的

答案 1 :(得分:6)

你说你问这个是因为代码长了几行。解决这个问题。 :)

   if( $dt1 > $dt2 )                      { do_this_thing() }
elsif( ($status != 3) || ($status != 6) ) { do_this_other_thing() }
else                                      { do_something_completely_different() }

现在,您在块中没有多行,并且所有内容都彼此相邻。您必须弄清楚这些条件是什么,因为任何值都不是3或不是6. :)

也许您打算使用and

   if( $dt1 > $dt2 )                   { do_this_thing() }
elsif( $status != 3 and $status != 6 ) { do_this_other_thing() }
else                                   { do_something_completely_different() }

答案 2 :(得分:1)

将带有var名称/值的print语句放入每个分支可能会有所帮助 您可以看到始终运行elsif分支,因为$status != 3 || $status != 6对于$status的任何值都为真。