- Prerrequisito: Conceptos básicos de hashes
Introducción
Más allá de las restricciones normales de los hashes, también podemos crear estructuras complejas formadas por combinaciones de dos. Estas son estructuras anidadas o complejas y se pueden usar para modelar datos complejos en un formato fácil de usar
.
Entre todas las estructuras anidadas de Perl, un hash multidimensional o hash de hashes es la más flexible. Es como construir un registro que en sí contiene un grupo de otros registros.
El formato para crear un hash de hash es similar al de una array de arrays. Simplemente, en lugar de asignar los valores a las claves primarias en un hash normal, asigne un hash completo que contenga claves secundarias y sus respectivos valores a las claves primarias del hash externo.
Sintaxis:
mi %hash = (primary_key => {secondary_key => {sub_sec_key => {…}}});
Ejemplo:
El siguiente ejemplo muestra un hash de hash que describe la organización de una empresa. Las claves principales son los departamentos y las claves anidadas son los nombres de los empleados. Los valores contienen entonces el cargo del empleado correspondiente.
# !/usr/bin/perl # Perl program to demonstrate # Multidimensional hash use strict; use warnings; use Data::Dumper qw(Dumper) ; # Creating a 2D hash my %company = ( 'Sales' => { 'Brown' => 'Manager' , 'Smith' => 'Salesman' , 'Albert' => 'Salesman' , }, 'Marketing' => { 'Penfold' => 'Designer' , 'Evans' => 'Tea-person' , 'Jurgens' => 'Manager' , }, 'Production' => { 'Cotton' => 'Paste-up' , 'Ridgeway' => 'Manager' , 'Web' => 'Developer' , }, ); # Print the List print Dumper(\ %company ); |
$VAR1 = { 'Marketing' => { 'Evans' => 'Tea-person', 'Jurgens' => 'Manager', 'Penfold' => 'Designer' }, 'Sales' => { 'Smith' => 'Salesman', 'Albert' => 'Salesman', 'Brown' => 'Manager' }, 'Production' => { 'Ridgeway' => 'Manager', 'Web' => 'Developer', 'Cotton' => 'Paste-up' } };
En el ejemplo anterior, la entrada de la función Dumper es una referencia a una estructura de datos y, por lo tanto, colocamos una barra invertida (\) delante de %company.
Nota: El orden de las claves es aleatorio ya que los hash no las mantienen en ningún orden específico.
Algunas otras operaciones:
- Para agregar otro miembro anónimo al hash existente:
Sintaxis:
$empresa{‘nueva_clave’} = {‘sub_clave1’ => valor1,
‘sub_clave2’ => valor2,
‘sub_clave3’ => valor3
}; - Acceder a un valor particular:
Sintaxis:
print $empresa{“Producción”}{“Web”}; # generará «Desarrollador» - Establecer el valor de una clave en particular:
Sintaxis:
$empresa{$Producción}->{“Web”} = Desarrollador sénior; # cambia Web a desarrollador sénior
Atravesando hashes multidimensionales
Para atravesar el hash multidimensional o recorrer cada valor en un hash, simplemente recorra las claves del hash externo y luego recorra las claves de los hash internos.
Para el hash de dimensión N, se requieren N bucles anidados o incrustados para atravesar el hash completo. Tanto los bucles For como While se pueden usar para pasar al hash.
Sintaxis:
for $key (keys %hash) { print "$key: \n"; for $ele (keys %{$hash{$key}}) { print " $ele: " . $hash{$key}->{$ele} . "\n"; } }
Para hashes multidimensionales de gran tamaño, puede ser un poco más rápido recuperar las claves y los valores al mismo tiempo usando cada palabra clave.
Sintaxis:
while (($key, $ele) = each %hash) { print "$key: \n"; while (($ele, $sub_ele) = each %$ele) { print " $ele = $sub_ele "; } print "\n"; }
El siguiente ejemplo ilustra el recorrido a través de un hash multidimensional usando bucles For
y : Ejemplo:while
# !/usr/bin/perl # Perl program to demonstrate # Traversing of # Multidimensional hash use strict; use warnings; use Data::Dumper qw(Dumper); my %company = ('Sales' => { 'Brown' => 'Manager', 'Smith' => 'Salesman', 'Albert' => 'Salesman', }, 'Marketing' => { 'Penfold' => 'Designer', 'Evans' => 'Tea-person', 'Jurgens' => 'Manager', }, 'Production' => { 'Cotton' => 'Paste-up', 'Ridgeway' => 'Manager', 'Web' => 'Developer', }, ); print "Traversing hash using For loop: "."\n"; print "\n"; # traversing hash using for loop for my $key (keys %company) { print "$key: \n"; for my $ele (keys %{$company{$key}}) { print " $ele: " . $company{$key}->{$ele} . "\n"; } } print "\nTraversing hash using while" . "loop using each keyword: " . "\n"; print "\n"; # traversing hash using each keyword # and while loop while ((my $key, my $ele) = each %company) { print "$key: \n"; while ((my $ele, my $sub_ele) = each %$ele) { print " $ele = $sub_ele "; } print "\n"; }
Traversing hash by For loop. Marketing: Evans: Tea-person Jurgens: Manager Penfold: Designer Sales: Brown: Manager Albert: Salesman Smith: Salesman Production: Cotton: Paste-up Web: Developer Ridgeway: Manager Traversing hash using while loop with each keyword. Marketing: Evans=Tea-person Jurgens=Manager Penfold=Designer Sales: Brown=Manager Albert=Salesman Smith=Salesman Production: Cotton=Paste-up Web=Developer Ridgeway=Manager
Comprobar la existencia de claves en hashes multidimensionales
Muchas veces, cuando trabajamos con un hash de Perl, necesitamos saber si una clave determinada ya existe en el hash. Dado un hash, se puede verificar la existencia de una clave en particular usando la exists
palabra clave.
En un hash multidimensional como %company utilizado en los ejemplos anteriores, uno tiene que usar la palabra clave exists
hasta que se alcance el nivel de profundidad de la clave cuya existencia se verifica.
Sintaxis:
if (exists($hash{key})) {
if (exists($hash{key}{sub_key})) {
….
}
}
También se debe tener cuidado al usar la construcción de nivel n sin probar primero el nivel (n-1), ya que eso podría desenstringr una autovivificación no deseada.
Ejemplo:
Aquí hay un ejemplo simple que demuestra la exists
función hash de Perl. En este script de Perl, primero crearemos un hash de Perl simple y luego usaremos la exists
función para ver si la clave hash denominada ‘Albert’ existe en el hash.
# !/usr/bin/perl # Perl program to check for # existence of a key in a # Multidimensional hash use strict; use warnings; my %company = ( 'Sales' => { 'Brown' => 'Manager' , 'Smith' => 'Salesman' , 'Albert' => 'Salesman' , }, 'Marketing' => { 'Penfold' => 'Designer' , 'Evans' => 'Tea-person' , 'Jurgens' => 'Manager' , }, 'Production' => { 'Cotton' => 'Paste-up' , 'Ridgeway' => 'Manager' , 'Web' => 'Developer' , }, ); # Check for key existence if ( exists $company { "Sales" }) { print "Sales department exists.\n" ; if ( exists $company { "Sales" }{ "Albert" }) { print "Albert is " . $company { "Sales" }{ "Albert" } . " of Sales department . \n" ; } else { print "Albert is not a member of Sales department.\n" ; } } else { print "Sales department do not exists.\n" ; } |
Sales department exists. Albert is Salesman of Sales department.
Publicación traducida automáticamente
Artículo escrito por BhavikBothra y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA