Operadores Lógicos

Perl tiene dos tipos de operadores lógicos: uno que tiene ''estilo C'' y el otro de ''estilo Pascal'':

  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
4
Toda 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.

Ejercicio 1.4.1   ¿Porqué 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
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19