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