Question

Cet extrait de code Perl dans mon programme donne un résultat erroné.

$condition ? $a = 2 : $a = 3 ;
print $a;

Quelle que soit la valeur de $condition c'est-à-dire que la sortie est toujours 3, comment se fait-il ?

Était-ce utile?

La solution

Ceci est expliqué dans le Perl Documentation.

En raison de la priorité des opérateurs Perl, l'instruction est analysée comme

($condition ? $a= 2 : $a ) = 3 ;

Parce que le ?:L'opérateur produit un résultat attribuable, 3 est affecté au résultat de la condition.

Lorsque $condition est vraie, cela signifie ($a=2)=3 donnant $a=3

Lorsque $condition est faux, cela signifie ($a)=3 donnant $a=3

La bonne façon d'écrire ceci est

$a = ( $condition ? 2 : 3 );
print $a;

Nous avons été mordus par cela au travail, alors je poste ici en espérant que d'autres le trouveront utile.

Autres conseils

Une fois que vous avez l’impression que vous souffrez peut-être de problèmes de préséance, une astuce pour comprendre ce que Perl pensait que vous vouliez dire :

perl -MO=Deparse,-p -e '$condition ? $a= 2 : $a= 3 ; print $a;'

Dans votre cas, cela vous montrera :

(($condition ? ($a = 2) : $a) = 3);
print($a);
-e syntax OK

...à ce moment-là, vous devriez dire « oh, ça explique ça » !

Juste pour prolonger la réponse précédente...Si, pour une raison quelconque, les affectations doivent faire partie du conditionnel, vous voudriez l'écrire ainsi :

$condition ? ($a=2) : ($a=3);

Cela serait utile si vous attribuez à différentes variables en fonction de la condition.

$condition ? ($a=2) : ($b=3);

Et si vous choisissez la variable, mais que vous lui attribuez la même chose quoi qu'il arrive, vous pouvez même faire ceci :

($condition ? $a : $b) = 3;

En raison de la priorité des opérateurs Perl, l'instruction est analysée comme :

($condition ? $a = 2 : $a ) = 3 ;

Parce que le ?:L'opérateur produit un résultat attribuable, 3 est affecté au résultat de la condition.

Lorsque $condition est vraie, cela signifie $a=2=3 donnant $a=3

Lorsque $condition est fausse, cela signifie $a=3 donnant $a=3

La bonne façon d'écrire ceci est

$a = $condition ? 2 : 3;

En général, vous devriez vraiment perdre l'habitude d'utiliser des conditions pour effectuer une affectation, comme dans l'exemple original -- c'est le genre de chose qui donne à Perl la réputation d'être en écriture seule.

Une bonne règle de base est que les conditions ne concernent que des valeurs simples, jamais des expressions avec des effets secondaires.Lorsque vous ou quelqu’un d’autre aurez besoin de lire ce code dans huit mois, préféreriez-vous qu’il se lise ainsi ?

$x < 3 ? foo($x) : bar($y);

Ou comme ça ?

if ($x < 3) {
  $foo($x);
} else {
  $bar($y);
}

Une suggestion à la réponse de Tithonium ci-dessus :

Si vous souhaitez attribuer différentes valeurs à la même variable, cela pourrait être mieux (à la manière d'un copybook) :

$a = ($condition) ?2 :3 ;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top