开发者

What is wrong with this if-elsif-else block in my Perl script?

开发者 https://www.devze.com 2023-01-16 03:25 出处:网络
I\'m trying to write a condition for a nested if statement, but haven\'t found a good example of using or in if statements.The following elsif condition fails and allows the code nested beneath it to

I'm trying to write a condition for a nested if statement, but haven't found a good example of using or in if statements. The following elsif condition fails and allows the code nested beneath it to fire if $status == 6:

if ($dt1 > $dt2 ) {do one thing}
elsif(($status != 3) || ($st开发者_如何学Goatus != 6)) { do something else}
else {do something completely different}

I'd like to avoid having another elsif for each condition as the code that actually resides here is several lines long.


Your logic is wrong and your elseif block will always return true. I think you mean to use an AND instead of an OR. Given the following snippet

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

This will output

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

If it helps your thinking, a conditional that is !something || !somethingElse can always be rewritten as !(something && somethingElse). If you apply this to your case above you'd say !(3 && 6), and seeing as a number cannot be 3 and 6 at the same time, it's always false


You said you're asking this because the code is several lines long. Fix that problem. :)

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

Now you don't have several lines in the block and everything is next to each other. You have to figure out what those conditions will be because any value is either not 3 or not 6. :)

Perhaps you meant to use and:

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


Putting print statements with var names/values into each branch can be helpful.
You could see that the elsif branch is always run, because $status != 3 || $status != 6 is true for any value of $status.

0

精彩评论

暂无评论...
验证码 换一张
取 消