Teniendo en cuenta el código:¿Cómo decide Perl qué orden evaluar los términos en una expresión?
my $x = 1;
$x = $x * 5 * ($x += 5);
yo esperaría $x
ser 180
:
$x = $x * 5 * ($x += 5); #$x = 1
$x = $x * 5 * 6; #$x = 6
$x = 30 * 6;
$x = 180;
180;
sino que es 30
; Sin embargo, si cambio el orden de los términos:
$x = ($x += 5) * $x * 5;
me pongo 180
. La razón por la que estoy confundido es que perldoc perlop
dice muy claramente:
A TERM tiene la precedencia más alta en Perl. Incluyen variables, presupuesto y operadores de tipo cita, cualquier expresión entre paréntesis y cualquier función cuyos argumentos estén entre paréntesis.
Dado que ($x += 5)
está entre paréntesis, debe ser un término y, por lo tanto, debe ejecutarse primero, independientemente del orden de la expresión.
Ya sabes, habiendo aprendido C primero, nunca hago cosas como esta y espero que funcione de la manera que creo que debería funcionar: http://c-faq.com/expr/index.html ;-) –
Yo también provengo de ANSI C, y sí, este no es el código que escribiría, estoy tratando de asegurarme de que entiendo la precedencia en Perl antes de que se lo explique a alguien más. Usar efectos secundarios como este es un gran no-no, pero aún legal en Perl. En ANSI C, si tenía más de un efecto secundario en una expresión, los resultados no estaban definidos, en Perl los efectos secundarios están mejor definidos, pero sigue siendo una muy mala idea. –
Una vez publiqué una buena publicación sobre esto para comp.lang.perl.misc, y nunca he podido encontrarla de nuevo. –