[Programación] Re: [Programación] Re: [Programació n] Duda en como llevar de C a perl.. . (función anónima)

Nicolás Aimetti programacion@lugro.org.ar
Thu, 15 Dec 2005 10:41:16 +0000


Buenas...

Perl es un lenguaje raro, lleno de sorpresas... Por eso es complicado a 
la hora de aprenderlo, porque si bien se parece a todo (y puede hacer 
casí todo), tampoco es estrictamente igual a nada, y estás diferecias 
más de una vez lo dejan a uno medio mal parado...

> Tengo una duda,, los operadores OR AND y NOT no
> devuelven valores 0 y 1, y yo requiero -1 0 +1, es
> decir....
> 
> 'Menor que 0' si $a < $b
> '0' si $a == $b
> 'Mayor que 0' si $a > $b
> 
> pero el operador OR me debería dar.... si 0 eq F (0
> lógico) y !=0 eq V (1 lógico) (esto lo recuerdo de C)
> entonces (-7) OR X =>1 y (+1) OR X =>1
> Entonces esto no funcaría salvo que el OR en perl
> tenga efecto colateral... (esto me recuerda a la
> guerra de irak...)
> 
> Saludos... Horacio (pta: no lo probé porque a mi
> criterio no funcionaría)
> 
> Es decir me parece muy mágico el tema de la
> precedencia...

En efecto el 'or' y el 'and' en perl, como tb el '||' y el '&&',
tienen efectos bastante mágicos, dado que no devuelven True y False o 1 
y 0 como habría de esperarse sino que la regla sería...
Supongamos que el or se definiese como una funcion que toma dos 
parametros $a y $b, su definición sería más o menos así...

sub or{
	my ($a,$b) = @_;
	return $a if $a;
	return $b;
}

O sea, si $a es verdadero (el string no vacio, o un número distinto de 
cero) el comando or devuelve el valor de $a, caso contrario devulve el 
valor de $b.

El and se definiria así:

sub and{
	my ($a,$b) = @_;
	return $a unless $a;
	return $b;
}

o sea, si $a es falso devulve $a, sino devulve el valor de $b.

Ejemplos:

my $a = 0;
my $b = "hola";

my $c = $a or $b; # $c es ahora igual a "hola"

my $c = "chau" and $b; $c es igual a "chau"

O sea que en el caso
  ($a cmp $b) or ($c cmp $d)

Si ($a cmp $b) da 0 entonces devulve el valor a que evalua ($c cmp $d),
sino devuelve el valor al que evalua ($a cmp $b);

El hecho de que estén definidos así estos operadores hace bastante 
simple muchas cosas a la hora de programar... lastima que no se respete 
para nada el tema del tipado, pero bueno, si estás buscando un leguaje 
con tipado fuerte perl definitivamente no es el indicado.

Saludos,
         Nicolás.