2010-09-10 7 views
0

J'essaye d'écrire une condition pour une instruction if imbriquée, mais je n'ai pas trouvé un bon exemple d'utilisation ou d'instructions if. La elsif condition suivante échoue et permet le code niché sous à feu si $status == 6:Quel est le problème avec ce bloc if-elsif-else dans mon script Perl?

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

Je voudrais éviter d'avoir une autre ELSIF pour chaque condition que le code qui se trouve en fait ici est plusieurs lignes.

+0

@mose: nécessité plus de contexte. pouvez-vous fournir plus de code? – Dummy00001

+3

'($ status! = 3) || ($ status! = 6) 'est toujours vrai. – flies

+0

** @ mouches: ** que se passe-t-il si le statut est 'undef'? – vol7ron

Répondre

1

Mettre des instructions print avec des noms/valeurs var dans chaque branche peut être utile.
Vous pouvez voir que la branche elsif est toujours exécutée, car $status != 3 || $status != 6 est vrai pour toute valeur de $status.

8

Votre logique est erronée et votre bloc elseif retournera toujours vrai. Je pense que vous voulez utiliser un ET au lieu d'un OU. Compte tenu de l'extrait suivant

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

Affichera

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

Si elle aide votre pensée, une condition qui est! Quelque chose || ! somethingElse peut toujours être réécrit comme! (quelque chose & & quelque choseElse). Si vous appliquez cela à votre cas ci-dessus vous diriez! (3 & & 6), et vu qu'un nombre ne peut pas être 3 et 6 en même temps, c'est toujours faux

+7

Ces règles de transformation sont appelées [lois de De Morgan] (http://en.wikipedia.org/wiki/De_Morgan's_laws). – daxim

6

Vous avez dit que vous demandez cela parce que le code est long de plusieurs lignes. Résoudre ce problème. :)

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

Maintenant, vous n'avez plus plusieurs lignes dans le bloc et tout est à côté de l'autre. Vous devez comprendre ce que ces conditions seront parce que toute valeur est pas 3 ou non 6. :)

Peut-être que vous vouliez utiliser and:

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

Certaines valeurs créées par ex. 'Perl6 :: Junction' pourrait être en désaccord :-) – rafl

+0

Je pensais aux jonctions, mais je suppose que ce n'est pas le problème ici. :) –