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

Mos*_*ose 0 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}
Run Code Online (Sandbox Code Playgroud)

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

tdd*_*key 8

你的逻辑错了,你的elseif块总是会返回true.我认为你的意思是使用AND而不是OR.给出以下片段

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

这将输出

1 => if
2 => if
3 => else
4 => if
5 => if
6 => else
7 => if
8 => if
9 => if
10 => if
Run Code Online (Sandbox Code Playgroud)

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

  • 这些转换规则称为[De Morgan定律](http://en.wikipedia.org/wiki/De_Morgan's_laws). (7认同)

bri*_*foy 6

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

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

现在你在块中没有几行,一切都是彼此相邻的.你必须弄清楚那些条件是什么,因为任何值都不是3或不是6. :)

也许你打算用and:

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

  • 由例如`Perl6 :: Junction`创建的某些值可能不同意:-) (2认同)