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