[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