2008-08-12 23 views

Respuesta

80

Esto se explica en el Perl documentation.

Debido a la precedencia de operadores Perl la declaración está siendo analizado como

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

Debido a que el operador?: Produce un resultado asignable, 3 se asigna al resultado de la condición.

Cuando $ condición es verdadera este medio ($ a = 2) = 3 dar $ a = 3

Cuando $ condición es falsa este medio ($ a) = 3 dar $ a = 3

la forma correcta de escribir esto es

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

Nos picaron por esto en el trabajo, por lo que estoy publicando aquí con la esperanza de que otros lo encuentren útil.

+1

"Cuando $ condición es verdadera, esto significa $ a = 2 = 3 entrega $ a = 3" habría pensado $ a = 2 = 3 sería un error de sintaxis expresión o lValue de error requerido o tal ... ¿Cómo se evalúa exactamente? – sundar

+0

Tienes razón, lo modificaré, es ($ a = 2) = 3 en lugar de $ a = 2 = 3 – Pat

21

Sólo para extender la respuesta anterior ... Si, por cualquier razón, las tareas tienen que ser parte de la condicional, que te gustaría escribirlo así:

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

Esto sería útil si estás asignando diferentes variables según la condición.

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

Y si usted está eligiendo la variable, pero la asignación de la misma cosa, no importa qué, incluso se podría hacer esto:

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

Una sugerencia para la respuesta de Tithonium arriba:

Si Si desea asignar diferentes valores a la misma variable, esto podría ser mejor (la forma de copiar libro):

$ a = ($ condición)? 2: 3;

40

Una vez que tenga una idea de que usted podría estar sufriendo de problemas de precedencia, un truco para averiguar lo que quería decir Perl pensó:

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

En su caso, que voy a mostrar:

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

... en cuyo punto debería decir "¡ah, eso lo explica!"

+0

Deparse es un divertido truco para fiestas. Por supuesto, una vez que sospecha que hay un problema de precedencia, normalmente llega a la solución ;-) – RET

4

Debido a la precedencia de operadores Perl la declaración está siendo analizado como:

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

Debido a que el operador?: Produce un resultado asignable, 3 se asigna al resultado de la condición.

Cuando $ condición es verdadera significa que este $ a = 2 = 3 dar $ a = 3

Cuando $ condición es falsa, esto significa $ a = 3 dar $ a = 3

La forma correcta de escribir esto es

$a = $condition ? 2 : 3; 

en general, usted debe salir de la costumbre de utilizar los condicionales asignación de tarea, como en el ejemplo originales - es el tipo de cosa que conduce a Perl conseguir una reputación de ser escritura -solamente.

Una buena regla de oro es que los condicionales son solo para valores simples, nunca expresiones con efectos secundarios. Cuando usted u otra persona necesiten leer este código dentro de ocho meses, ¿preferiría que se lea así?

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

¿Te gusta esto?

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