perl | Hashes multidimensionales

    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);
    Producción:

    $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 Fory : 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";
}
Producció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 existspalabra clave.
    En un hash multidimensional como %company utilizado en los ejemplos anteriores, uno tiene que usar la palabra clave existshasta 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 existsfunción hash de Perl. En este script de Perl, primero crearemos un hash de Perl simple y luego usaremos la existsfunció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";
    }
    Producció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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *