[Perl] - Sort y Matrices
Gunnar Wolf
gwolf@campus.iztacala.unam.mx
Fri, 24 Aug 2001 16:16:35 -0500 (CDT)
Hola!
> Tengo (en win98) una base de datos TXT de esta manera
>
> nombre|apellido paterno|apellido
> materno|rectoria|direccion|departamento|email|telefono|ext|
>
> Y necesito ordenarla de acuerdo a rectoria, luego direccion, luego
> departamento y por ultimo apellidos y nombre
Perl tiene ya implementado de caj=F3n el quicksort, as=ED que no ten=EDas p=
or
qu=E9 tomarte la molestia de hacerlo ;-) De hecho, la funci=F3n sort de Per=
l
es una maravilla. Escribo esto al hilo, por lo que pueque no funcione a la
primera, pero va... Tienes tu texto completo, cada registro en una l=EDnea,
en el arreglo @desordenado, y quieres la salida en @ordenado.
Por simplicidad (podr=EDas evitarlo) voy a crear un arreglo @temporal_d
para desordenado y un temporal_o para ordenado.
my @temporal_d =3D ();
my @temporal_o =3D ();
my @ordenado =3D ();
foreach my $lin (@desordenado) {
my @tmp =3Dsplit(/|/,$lin);
push (@temporal_d,\@tmp);
}
@temporal_o =3D sort {$a->[5] cmp $b->[5]} (@temporal_d);
foreach my $lin (@temporal_o) {
push (@ordenado,join('|',@$lin));
}
Ahora, esto lo ordena s=F3lo por un criterio. Adem=E1s, el c=F3digo est=E1 =
feo (lo
escrib=ED al vuelo). Queda como reto para t=ED (y no es nada descabellado)
deshacerte del split y el join, y de ambos forach, y de @temporal_d y
@temporal_o, haciendo todo esto en un s=F3lo paso y con una s=F3la l=EDnea =
de
c=F3digo. En serio, no es dif=EDcil, pero tienes que jugar con referencias =
y
dereferencias.
Si lo quieres ordenar por varios criterios, ord=E9nalo primero por el menos
importante, luego por el siguiente, y por =FAltimo por el m=E1s importante.
Ac=E1 ordeno s=F3lo por rector=EDa.
El operador cmp (que uso en el sort) es equivalente al <=3D> pero para
cadenas.
Hay un puente retealto en camino a Acapulco, pero si vienes desde
Monterrey puede que te rajes antes de llegar ah=ED.
Saludos!
------------------------------------------------------------
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52)5623-1118
Desarrollo y Admon. de Sistemas en Red - FES Iztacala - UNAM
Departamento de Seguridad en Computo - DGSCA - UNAM
------------------------------------------------------------
Quidquid latine dictum sit, altum viditur.