[bcn-pm] Ordenando arreglos y hashes

Alex Muntada alexm at cpan.org
Sat Jan 3 13:48:53 CST 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

* Luis Medrano Zaldivar:  [2003-12-31/19:04:36 +0000]

> Tengo una pregunta si tengo estos arreglos como los podria
> ordenar [...] de menor a mayor y de mayor a menor [...]
> alfabeticamente [...] y en el caso de hashes quisiera ordenarlo
> por el valor numerico de las llaves:
 
Hola Luis,
et reenvio els comentaris d'alguns companys de la llista ja que
he vist que tu no hi estàs subscrit i les respostes només anaven
dirigides a la llista.


* Xavier Noria:  [2004-01-01/17:22:26 +0100]

> Echale un vistazo a sort (perldoc -f sort), y mira la
> documetacion de <=> y cmp en perlop (perldoc perlop). Te seran
> muy utiles tambien las entradas sobre ordenacion del FAQ
> (perldoc -q sort).


* Timothy Chen Allen:  [2004-01-01/11:43:29 -0500]

> Aqui tienes un programa que ilustra algunas formas de jugar con
> ordenar con tus ejemplos.  El unico que me estra~a es que
> quieres ordenar por el valor numerico del hash-- en tu ejemplo,
> los *valores*, no las llaves, son numericos. Como dice Xavi,
> leete el perldoc. Tambien, seria interesante mirar el efecto de
> poner un use strict al principio de este programa-- hay cosas
> que romperian en seguida de que podrias aprender.
> 
> # numerico
> @arrelgo=(40,100,1,50);
> print "num\n";
> map {print "$_\n"} (sort {$a <=> $b} @arrelgo);
> 
> # ordenar de manera alfabeticamente:
> @arreglo=(luis,alberto,karla);
> print "\nalfa\n";
> map {print "$_\n"} (sort {$a cmp $b} @arreglo);
> 
> # y en el caso de hashes quisiera ordenarlo por
> # el valor numerico de las llaves:
> print "\nhash\n";
> $ejemplo{luis}=100;
> $ejemplo{alberto}=200;
> $ejemplo{karla}=150;
> map {print $ejemplo{$_}."\n"} (sort {$ejemplo{$a} cmp
> $ejemplo{$b}} (keys %ejemplo));

Només voldria fer un comentari sobre la solució que proposa en
Tim al Luis: no s'hauria d'utilitzar mai una funcio costosa com
el print dins un map perquè fa força lleig i resulta ineficient.

L'alternativa és molt més simple del que podria semblar perquè
només cal treure'l fora del map, així:

  print map  { $ejemplo{$_}."\n" }
        sort { $ejemplo{$a} cmp $ejemplo{$b} }
        keys %ejemplo;


Salutacions i bon any a tots!

- --
Alex Muntada <alexm at cpan.org>
http://alexm.org/

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)

iD8DBQE/9xyULdxCGS3zaBERAmLrAKCrW2AwkZWN50bxwd7ifoywYTgfwACgs4kL
fkkMQwy9ydxXlW7EPoPCeow=
=EXPc
-----END PGP SIGNATURE-----



More information about the Barcelona-pm mailing list