Pregunta

Este fragmento de código Perl en mi programa da un resultado incorrecto.

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

No importa cuál sea el valor de $condition Es decir, la salida es siempre 3, ¿por qué?

¿Fue útil?

Solución

Esto se explica en Perl. documentación.

Debido a la precedencia del operador Perl, la declaración se analiza como

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

Porque el ?:El operador produce un resultado asignable, se asigna 3 al resultado de la condición.

Cuando $condición es verdadera, esto significa ($a=2)=3 dando $a=3

Cuando $condición es falsa esto significa ($a)=3 dando $a=3

La forma correcta de escribir esto es

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

Esto nos molestó en el trabajo, así que lo publico aquí con la esperanza de que otros lo encuentren útil.

Otros consejos

Una vez que tengas una idea de que podrías estar sufriendo problemas de precedencia, un truco para descubrir qué pensó Perl que querías decir:

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

En su caso, eso le mostrará:

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

... ¡en ese momento deberías decir "oh, eso lo explica todo"!

Sólo para ampliar la respuesta anterior...Si, por alguna razón, las tareas deben ser parte del condicional, querrás escribirlo de esta manera:

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

Esto sería útil si asigna diferentes variables según la condición.

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

Y si eliges la variable, pero asignas la misma cosa pase lo que pase, incluso puedes hacer esto:

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

Debido a la precedencia de los operadores de Perl, la declaración se analiza como:

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

Porque el ?:El operador produce un resultado asignable, se asigna 3 al resultado de la condición.

Cuando $condición es verdadera, esto significa $a=2=3 dando $a=3

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

La forma correcta de escribir esto es

$a = $condition ? 2 : 3;

En general, deberías dejar el hábito de usar condicionales para realizar tareas, como en el ejemplo original; es el tipo de cosas que hacen que Perl adquiera la reputación de ser de solo escritura.

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

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

¿O así?

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

Una sugerencia para la respuesta anterior de Tithonium:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top