Es muy curioso lo que pasa.
Resulta que los operadores lógicos devuelven el último valor o expresión evaluada que confirme toda la expresión lógica.
En caso de un '
and', todas las expresiones deben ser ciertas para devolver un valor de cierto, y en ese caso, devuelve el último valor de la última expresión evaluada (la que está más a la derecha).
En el caso planteado, deberían ser las 'peras' las que deberían de aparecer en pantalla, pero lo que salen son las 'manzanas'.
¿Dónde está el fallo?
Pues resulta que
print $a and $b; es lo mismo que si hubieras escrito
(print $a) and $b; Es decir, imprimes 'manzanas' porque es la primera expresión a evaluar; como es una expresión cierta (imprimimos un valor), luego evalúa 'peras'. Pero el resultado del
and se pierde.
Cosa distinta es escribir entonces
print ($a and $b); que, por fin y de esta manera, salen nuestras queridas 'peras'...
Y cosa distinta sería si quisiéramos imprimir
$a sólo en el caso de que
$b fuera cierta:
print $a if $b;