Hashes

Table of contents

  1. Iterar sobre un hash
  2. Ordenar un hash
  3. Hash de hashes

Estructura de datos que es un conjunto pares clave:valor. Los hashes se declaran con el simbolo %.

%hash = (
	"clave_1" => 1,
	"clave_2" => 2,
	"clave_3" => 3
);

Para hacer referencia a un valor de un hash, se hace de $

$hash{"clave_1"};

La salida del codigo es el valor 1

Iterar sobre un hash

Primera forma

#!/usr/bin/env perl

%hash = (
	"clave_1" => 1,
	"clave_2" => 2,
	"clave_3" => 3
);

foreach my $clave (keys %hash){
	print "Clave: $clave - Valor: $hash{$clave}\n";
}

Se usa la palabra keys para obtener todas las claves del hash (clave_1, clave_2…) Se declara de esta forma $hash{$clave}para acceder a los valores asociados de cada clave ($clave)

  • Se usa $en hash para acceder al valor de cada clave

Segunda forma

while (my ($clave, $valor ) = each %hash){
	print "Clave: $clave - Valor: $valor\n";
}

Tercera forma

print map ("$_ = $hash{$_}\n", keys %hash);

La funcion map()evalua la expresion para cada elemento de un arreglo o hash, en este caso la expresion es "$_ = $hash{$_}\n", se explica de esta forma

  • $_ Representa cada clave del hash
  • $hash{$_} Representa el valor asociado a la clave del punto anterior ($_)

Ordenar un hash


En Perl los hashes son almacenados de acuerdo a la ubicacion de memoria, por lo que cuando se imprimen salen aleatorios, esto con el objetivo de prevenir ataques de complejidad algoritmica

Para ordenar hashes de acuerdo a su clave solo es necesario ingresar la palabra sort

foreach my $clave (sort(keys %hash)){
	print "Clave: $clave - Valor: $hash{$clave}\n";
}

Hash de hashes


my %waifus = (
	"Arknights" => {
		"Exusiai" => 1,
		"Texas" => 2,
		"Lappland" => 3,
	},
	"Genshin" => {
		"Hu Tao" => 4,
		"Layla" => 5,
		"Faruzan" => 6,
	},
);  

foreach my $clave (keys %waifus){
	print "$clave\n";
	foreach $clave_subhash (keys %{$waifus{$clave}}){
		my $valor = $waifus{$clave}->{$clave_subhash};
		print "\t$clave_subhash: $valor\n";
	}
}
  • $clave tiene la clave a cada hash dentro del hash %waifus (Arknights y Genshin)
  • %{$waifus{$clave}} accede a las claves asociadas en $clave (se usa % para desreferenciarlo y volverlo un hash de nuevo), esas claves las almacena en $clave_subhash
  • $waifus{$clave}->{$clave_subhash} accede al valor asociado en $clave_subhash