[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.