Ver Mensaje Individual
  #9 (permalink)  
Antiguo 03/06/2008, 13:45
jferrero
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 524
Antigüedad: 18 años
Puntos: 11
Respuesta: duda sobre organizar elementos

Código:
my @elementos2
    =  map  { $_->[1]                 }
       sort { $a->[0] cmp $b->[0]     }
       map  { [ (split q{:})[2], $_ ] }
       @elementos;
Hay que leer la transformada de abajo hacia arriba.

Los @elementos son pasados, uno a uno, al conjunto map-sort-map.

El primer map (empezando por abajo), lo que hace es mapear cada elemento ($_) en algo muy extraño: un array anónimo ([]) que contiene dos elementos. El segundo elemento de este array es el propio elemento $_. El primer elemento es algo más complicado.

Ese primer elemento, lo que hace es un split() usando ':' como separador. El resultado de un split es una lista de valores. Esos valores quedan encerrados entre los paréntesis, convirtiéndolos en un "array". De ese array ficticio, solo nos quedamos con el tercer elemento (2). Es decir, nos quedamos con el tercer campo de cada elemento $_, que son los nombres por los que queremos ordenar.

Cada mapeo resulta entonces en algo como
Código:
[ 'pedro', '1::pedro::' ]
El siguiente paso es pasar todos estos nuevos arrays al sort. En el sort, se reciben en $a y $b los elementos a comparar, y nosotros tenemos que decir cómo se comparan esos elementos.

Como $a y $b son arrays anónimos, no podemos compararles tal cual. Solo queremos comparar el primer elemento de cada array. Por eso escribimos
Código:
$a->[0]
La indirección '->' nos mete dentro del array anónimo referenciado por $a. Y de ese array, nos quedamos con el primer elemento ([0]). Que son, justamente, los nombres.

La comparación entre esos dos nombres, la haremos alfanuméricamente, por lo que usaremos 'cmp'.

El resultado después del sort son todos los arrays anónimos, ordenados por los nombres.

Ahora hay que hacer el proceso inverso del primer map, con un segundo map. Este map recibe los arrays anónimos, en el orden que nos interesa, pero de los que solo nos interesa el segundo elemento ([1]) que, al final, eran los elementos originales de los que partíamos.

Uno a uno, se van guardando en @elemento2.