Los valores de un
hash nunca se guardan en el orden en que se almacenan.
Primer párrafo de
perldata: «Perl posee tres tipos de datos básicos: escalares, arreglos de escalares, y arreglos asociativos de escalares, conocidos como "diccionarios". Un escalar es una simple cadena (de cualquier tamaño, limitada solo por la memoria disponible), número o una referencia a otra cosa (que será explicada en
perlref). Arreglos normales son listas ordenadas de escalares indexadas por número, empezando por 0. Los diccionarios son colecciones
desordenadas de valores escalares indexados por una cadena clave asociada al valor.»
Una vez que tienes la información en un diccionario, ahora depende de cómo quieres obtener la salida de esa información.
Si, por ejemplo, queremos verla ordenada por
id, solo tendríamos que ordenar las claves, en este caso, numéricamente:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
my @categorias = (
'1||1 Puerta principal||0',
'2||2 Entrada garaje||0',
'3||3 Terraza||0',
'4||4 Terraza-cocina||0',
'5||5 Cocina||0',
'6||6 Patio ropas||0',
'7||7 Garaje||0',
'8||8 Puerta garaje||0',
'9||9 Corredor principal||0',
'10||10 Comedor||0',
'11||11 Balcón sala teatro||0',
'12||12 Sala teatro||0',
'13||13 Alcoba principal||0',
'14||14 Balcón alcoba principal||0',
'15||15 Balcón alcoba 2||0',
'16||16 Alcoba 2||0',
'17||17 Baño alcoba 2||0',
'18||18 Baño alcoba 1||0',
'19||19 Alcoba 1||0',
'20||20 Hall alcobas||0',
'21||21 Vestier||0',
'22||22 Baño vestier||0',
'23||23 Baño alcoba principal||0',
);
my %loop;
for my $registro (@categorias) {
#chomp $registro;
my ($id, $nombre, $privacidad) = split /\|\|/, $registro;
if (not $privacidad) {
$loop{$id} = $nombre;
}
}
my @indices_loop_ordenado = sort { $a <=> $b } keys %loop; # ordenación numérica por claves
for my $clave (@indices_loop_ordenado) {
print "$clave => $loop{$clave}\n";
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Sale:
Using text Syntax Highlighting
1 => 1 Puerta principal
2 => 2 Entrada garaje
3 => 3 Terraza
4 => 4 Terraza-cocina
5 => 5 Cocina
6 => 6 Patio ropas
7 => 7 Garaje
8 => 8 Puerta garaje
9 => 9 Corredor principal
10 => 10 Comedor
11 => 11 Balcón sala teatro
12 => 12 Sala teatro
13 => 13 Alcoba principal
14 => 14 Balcón alcoba principal
15 => 15 Balcón alcoba 2
16 => 16 Alcoba 2
17 => 17 Baño alcoba 2
18 => 18 Baño alcoba 1
19 => 19 Alcoba 1
20 => 20 Hall alcobas
21 => 21 Vestier
22 => 22 Baño vestier
23 => 23 Baño alcoba principal
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Ahora bien, si lo que quieres es ordenarlo por los valores, y además, alfabéticamente, debemos cambiar la línea 45 por esta otra:
Using perl Syntax Highlighting
my @indices_loop_ordenado = sort { $loop{$a} cmp $loop{$b} } keys %loop; # ordenación de las claves por el orden alfabético de los valores
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Pero... fíjate que en el $nombre que estás guardando como valor, empieza por un número:
Using perl Syntax Highlighting
use Data::Dumper;
print Dumper \%loop;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Using text Syntax Highlighting
$VAR1 = {
'11' => '11 Balcón sala teatro',
'21' => '21 Vestier',
'7' => '7 Garaje',
'17' => '17 Baño alcoba 2',
'2' => '2 Entrada garaje',
'22' => '22 Baño vestier',
'1' => '1 Puerta principal',
'18' => '18 Baño alcoba 1',
'23' => '23 Baño alcoba principal',
'16' => '16 Alcoba 2',
'13' => '13 Alcoba principal',
'6' => '6 Patio ropas',
'3' => '3 Terraza',
'9' => '9 Corredor principal',
'12' => '12 Sala teatro',
'20' => '20 Hall alcobas',
'14' => '14 Balcón alcoba principal',
'15' => '15 Balcón alcoba 2',
'8' => '8 Puerta garaje',
'4' => '4 Terraza-cocina',
'19' => '19 Alcoba 1',
'10' => '10 Comedor',
'5' => '5 Cocina'
};
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
así que si quieres ordenarlos alfabéticamente, deberías antes quitarles esos números:
Using perl Syntax Highlighting
$nombre =~ s/^[\d\s]+//;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y ahora sí que sale bien:
Using text Syntax Highlighting
19 => Alcoba 1
16 => Alcoba 2
13 => Alcoba principal
15 => Balcón alcoba 2
14 => Balcón alcoba principal
11 => Balcón sala teatro
18 => Baño alcoba 1
17 => Baño alcoba 2
23 => Baño alcoba principal
22 => Baño vestier
5 => Cocina
10 => Comedor
9 => Corredor principal
2 => Entrada garaje
7 => Garaje
20 => Hall alcobas
6 => Patio ropas
8 => Puerta garaje
1 => Puerta principal
12 => Sala teatro
3 => Terraza
4 => Terraza-cocina
21 => Vestier
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Si, de todas maneras, necesitas que el diccionario recuerde el orden de las claves a medida de que fueron creadas, lo tienes resuelto en
perlfaq4: How can I make my hash remember the order I put elements into it?