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);
}
"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
Vous avez raison, je vais le modifier c'est ($ a = 2) = 3 au lieu de $ a = 2 = 3 – Pat