[Programación] Re: [Programación] Cosas a la perl que no cazo.... y que me dan error. ..

Nicolás Aimetti programacion@lugro.org.ar
Fri, 09 Dec 2005 17:39:03 +0000


Buenas...

> Esta cosa a la perl si funca aunque no entiendo bien que hace....
> # 1--------------------
> %A=();
> @A{map{$_->[0]} @C}=();
> $cont2=scalar keys %A;

Un viejo truco de perl para resolver el problema de los datos repetidos 
y muchos otros más...

%A es un hash (en perl)... o sea, una estructura clave => dato donde
las claves son siempre únicas. El truco es setear con los valores del 
array a limpiar de valores repetidos las claves de un hash, que siempre 
son únicas, y ahí inmediatamente se eliminan los valores repetidos.
Muy bien, una forma de hacer esto más entendible sería hacer
my %A();
foreach my $e ( @X ){
	$A{$e} = (); # es lo mismo que igualarlo a undef, tb se puede igualar a 
1, u otro valor, pero estariamos desperdiciando memoria.
}
Leugo tenemos un hash cuyas claves son los valores no repetidos del 
array @X.

la forma lo que yo hice es  usar una forma más idiomatica de perl...
perl permite setear en un hash varias claves  a la vez, a esto se le 
llama usar SLIDES...
Un ejemplo de uso de slide :
@A{'clave1','clave2'} = ($valor1,$valor2);
luego %A sera:
%A = ( clave1 => valor1 , clave2 => valor2 );

Bueno, jugando con estas cosas sale la sentencia anterior...

Y  bueno, después habría que hablar de la funcion map (delicia de los 
lenguajes funcionales), que es parecida al sort en el sentido de que 
toma una funcion, la aplica a cada elemento de la lista, y devuelve la 
lista resultado.


> # 2--------------------------------
> @T1=map{ my $actual=$_; [$_, scalar (grep {$_->[0]==$actual} @C)]} (keys
> %A);
> print join(',',@$_),$/ for @T1 ;

@T1=map{ my $actual=$_; [$_, scalar (grep {$_->[0]==$actual} @C...
                                                   ^^
Sin no me equivoco lo que pasa aca es que use chequear la igualdad use 

el operador == que es para datos numericos, y los datos que estás usando 
son alfanumericos, en cuyo caso debe usarse el operador eq, o sea, 
quedaria:

@T1=map{ my $actual=$_; [$_, scalar (grep {$_->[0] eq $actual} @C)]} 
(keys %A);

Por lo general si uno no sabe que va a venir combiene usar el eq, que tb 
anda bien con los numeros... si uno sabe que los datos son numericos 
usar el operador == creo que es más eficiente.


Saludos,
         Nicolás.