Un hash simple está cerca de una matriz. Sus inicializaciones incluso se ven similares.En primer lugar la matriz:
@last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
Ahora vamos a representar la misma información con un hash (matriz alias asociativo):
%last_name = (
"Ward", "Cleaver",
"Fred", "Flintstone",
"Archie", "Bunker"
);
pesar de que tienen el mismo nombre, la matriz @last_name
y el hash %last_name
son completamente independientes .
Con la matriz, si queremos saber el apellido de Archie, tenemos que realizar una búsqueda lineal:
my $lname;
for (my $i = 0; $i < @last_name; $i += 2) {
$lname = $last_name[$i+1] if $last_name[$i] eq "Archie";
}
print "Archie $lname\n";
Con el hash, que es mucho más sintácticamente directa:
print "Archie $last_name{Archie}\n";
Say queremos representar la información con solo una estructura un poco más rica:
- Cleaver (apellido)
- Ward (nombre de pila)
- junio (primer nombre del cónyuge)
- Picapiedra
- Bunker
Antes de referencias llegó, los hashes de valores clave planas eran de lo mejor que podíamos hacer, pero las referencias permiten
my %personal_info = (
"Cleaver", {
"FIRST", "Ward",
"SPOUSE", "June",
},
"Flintstone", {
"FIRST", "Fred",
"SPOUSE", "Wilma",
},
"Bunker", {
"FIRST", "Archie",
"SPOUSE", "Edith",
},
);
Internamente, las claves y los valores de %personal_info
son todos escalares, pero los valores son un tipo especial de referencias hash escalares, creadas con {}
. Las referencias nos permiten simular hashes "multidimensionales". Por ejemplo, podemos llegar a Wilma a través
$personal_info{Flintstone}->{SPOUSE}
Tenga en cuenta que Perl nos permite omitir flechas entre los subíndices, por lo que la anterior es equivalente a
$personal_info{Flintstone}{SPOUSE}
Eso es un montón de escribir si quieres saber más sobre Fred, por lo que podría agarrar una referencia como una especie de cursor:
$fred = $personal_info{Flintstone};
print "Fred's wife is $fred->{SPOUSE}\n";
Debido $fred
en el fragmento anterior es una hashref, la flecha es necesario.Si lo deja fuera, pero con prudencia habilitado use strict
para ayudarle a coger este tipo de errores, el compilador se quejará:
Global symbol "%fred" requires explicit package name at ...
referencias Perl son similares a los punteros en C y C++, pero nunca puede ser nulo. Los punteros en C y C++ requieren desreferenciación y también lo hacen las referencias en Perl.
Los parámetros de las funciones C y C++ tienen una semántica de paso a paso: son solo copias, por lo que las modificaciones no se transmiten a la persona que llama. Si desea ver los cambios, debe pasar un puntero. Usted puede obtener este efecto con referencias en Perl:
sub add_barney {
my($personal_info) = @_;
$personal_info->{Rubble} = {
FIRST => "Barney",
SPOUSE => "Betty",
};
}
add_barney \%personal_info;
Sin la barra invertida, add_barney
habría conseguido una copia que ha desechado tan pronto como los sub devoluciones.
Tenga en cuenta también el uso de la "coma de grasa" (=>
) anterior. Automatiza la cadena a su izquierda y hace que las inicializaciones de hash sean menos ruidosas sintácticamente.
_ * te da una manzana * _ pretenden que es un hash. _ * manos que escribiste instrucciones para una manzana en la nevera * _ eso es una referencia hash. –
Puede consultar el capítulo de _Learning Perl_ sobre hashes. –
@ ~ curandero: Desearía que hubiera sido una respuesta en lugar de un comentario para poder votarte correctamente. –