[Programación] Re: [Programación] Re: [Programación] Cosas a la
perl que no cazo.... y que me dan error...
José Luis Diaz
programacion@lugro.org.ar
Sat, 10 Dec 2005 02:20:49 -0300
On Friday 09 December 2005 14:39, Nicolás Aimetti wrote:
> Buenas...
>
> > Esta cosa a la perl si funca aunque no entiendo bien que hace....
> > # 1--------------------
> > %A=();
> > @A{map{$_->[0]} @C}=();
> > $cont2=scalar keys %A;
>
foreach $_ ( @C) {
@A{$_->[0]}=();
}
> 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.
> }
$A{$e->[0]} = ();
> Leugo tenemos un hash cuyas claves son los valores no repetidos del
> array @X.
Si, los primeros valores del array contenido dentro del array que sea
distinto! :D
> 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 ;
>
osea...
my @C = (
[ 8, 9, 4 ],
[ 8, 5, 4 ],
[ 0, 1, 2 ],
[ 3, 4, 6 ],
);
%A=();
@A{map{$_->[0]} @C}=();
$cont2=scalar keys %A;
Despues de eso...
%A = {
8 => (),
0 => (),
3 => ()
};
quedaria una unica entrada por cada "Primer elemento" de cada sub-array.
y despues
@T1=map{
my $actual=$_; # cada una de las claves del hash
[$_, scalar (grep {$_->[0]==$actual } @C)]
} (keys %A);
donde:
grep {$_->[0]==$actual } @C #
va a devolver un arrays de arrays donde los primeros elementos son todos
iguales.
... y scalar va a forzar a interpretarlo como un contexto escalar... entonces
va a devolver el numero de elementos que tiene el array.
[$_, scalar (grep {$_->[0]==$actual } @C)]
que es equivalante a:
[$actual, scalar (grep {$_->[0]==$actual } @C)] #
va a generar un par, donde el $actual es el numero del primer elemento de @C,
y el segundo elemento es la cantidad de arrays con ep primer elemento igual
que hay en C.
print join(',',@$_),$/ for @T1 ;
va a imprimir el array @T1 (el que acabamos hermosamente de construir) y va a
usar $/, quee es por defecto el delimitador de fin de linea, podria
tranquilamente usarse :
print join(',',@$_), "\n" for @T1 ;
... lo que demuestra que: "Perl is a write only language" :P
-J.
PD: Muy groso los SLIDES! no los conocia! :)
--
José Luis Diaz - jose(at>citynet.net.ar /"\ ASCII Ribbon Campaign
GNU/Linux Registered User #138499 \ / No HTML in mail or news!
RTFM! - http://rtfm.org.ar X
"Kernel Panic - No signature found" / \
--
PGPkey: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x7BCD2757