DB<1> $a = 4; $b = "hola"; $c = 0; $d = ""; DB<2> p $a && $b hola DB<3> p $a and $b 4 DB<4> p ($a and $b) hola DB<5> p $c 0 DB<6> p !$c 1 DB<7> p not $c 1 DB<8> p not $d 1 DB<9> p !$d 1 DB<10> p $a || $b 4 DB<11> p $a or $b 4Toda la evaluación se hace en circuito corto. Así
$a and $b es $a si $a es falso,
si no da como resultado $b.
Lo mismo es cierto para $a && $b.
p $a and $b produce como salida 4? ¿Es ese
realmente el resultado de la evaluación de la expresión?
Antes de contestar estudie este experimento:
DB<1> $a = 4; $b = "hola"; DB<2> $d = (print $a and $b) 4 DB<3> p $d hola DB<4> $e = print $a and $b 4 DB<5> p $e 1 DB<6> $d = (print $a && $b) hola DB<7> p $d 1¿Porqué
$d contiene "hola" en la línea 3
y sin embargo se imprime un 4 en
la línea 2? ¿Como interpreta Perl la expresión print $a and $b?
¿Como (print $a) and $b? o bien como ¿ print ($a and $b)?
¿Que tiene mas prioridad, el operador and o la llamada a print?
¿Ocurre lo mismo con el operador &&?Para saber en que forma esta parentizando Perl un programa puede usarse el módulo B::Deparse con el siguiente formato:
lhp@nereida:~/Lperl/src$ cat -n parenthesis.pl
1 $a = 4;
2 $b = "hola";
3 $c = print $a and $b
lhp@nereida:~/Lperl/src$ perl -MO=Deparse,-p parenthesis.pl
($a = 4);
($b = 'hola');
(($c = print($a)) and $b);
parenthesis.pl syntax OK
Así se ve claro que $c contiene el valor retornado
por la llamada a print($a).
Casiano Rodríguez León
