2008-08-12 5 views

Répondre

80

Ceci est expliqué dans le Perl documentation.

En raison de l'opérateur Perl priorité l'instruction est en cours d'analyse comme

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

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

Lorsque $ condition est vrai ce moyen ($ a = 2) = 3 donnant $ a = 3

Lorsque $ condition est fausse ce moyen ($ a) = 3 donnant $ a = 3

la bonne façon d'écrire c'est

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

Nous sommes piqués par ce au travail, donc je suis ici en espérant d'autres afficherons trouveront utile.

+1

"Quand $ condition est vraie, cela signifie $ a = 2 = 3 donnant $ a = 3" j'aurais pensé $ a = 2 = 3 serait une erreur de syntaxe d'expression ou lValue erreur requise ou telle ... Comment exactement est-il évalué? – sundar

+0

Vous avez raison, je vais le modifier c'est ($ a = 2) = 3 au lieu de $ a = 2 = 3 – Pat

21

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

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

Ce serait utile si vous affectez à différentes variables en fonction de la condition.

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

Et si vous choisissez la variable, mais l'attribution de la même chose, peu importe quoi, vous pouvez même le faire:

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

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

Si vous voulez assigner des valeurs différentes à la même variable, cela pourrait être mieux (le copy-book):

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

40

Une fois que vous avez une petite idée que vous pourriez souffrir de problèmes de priorité, une astuce pour comprendre ce que Perl a pensé que vous vouliez dire:

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

Dans votre cas, ça va vous montrer:

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

... à quel point vous devriez dire "oh, ça l'explique"!

+0

Deparse est un tour de jeu très propre. Bien sûr, une fois que vous soupçonnez un problème de précédence, vous êtes en général le plus souvent à la solution ;-) – RET

4

En raison de l'opérateur Perl priorité l'instruction est en cours d'analyse comme:

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

Parce que le: opérateur produit un résultat assignable, 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 écrire c'est

$a = $condition ? 2 : 3; 

en général, vous devriez vraiment sortir de l'habitude d'utiliser conditionals à faire cession, comme dans l'exemple d'origine - il est le genre de chose qui conduit à Perl obtenir la réputation d'être écrire -seulement. Une bonne règle générale est que les conditions ne sont que pour des valeurs simples, jamais des expressions avec effets secondaires. Quand vous ou quelqu'un d'autre a besoin de lire ce code dans huit mois, préférez-vous qu'il se lise comme ça?

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

Ou comme ça?

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