¿Cómo puedo almacenar múltiples valores en una tabla hash Perl?
multiple-value perl-data-structures (5)
% chums = ("Allan" => {"Boss" => "George", "Estado" => "Contratista"}, "Bob" => {"Jefe" => "Peter", "Estado" => " Medio tiempo"} );
funciona bien, pero ¿hay una forma más rápida de ingresar los datos?
Estoy pensando en algo así como
% chums = (qw, x) (Allan Boss George Contratista de estado Bob Boss Peter Status a tiempo parcial)
donde x = el número de claves secundarias después de la clave principal, en este caso x = 2, "Jefe" y "Estado"
Hasta hace poco, he estado almacenando varios valores en hash diferentes con las mismas claves de la siguiente manera:
%boss = (
"Allan" => "George",
"Bob" => "George",
"George" => "lisa" );
%status = (
"Allan" => "Contractor",
"Bob" => "Part-time",
"George" => "Full-time" );
y luego puedo hacer referencia a $boss("Bob")
y $status("Bob")
pero esto se vuelve difícil de manejar si hay muchas propiedades que puede tener cada clave y tengo que preocuparme por mantener los hashes sincronizados.
¿Hay una mejor manera de almacenar múltiples valores en un hash? Podría almacenar los valores como
"Bob" => "George:Part-time"
y luego desmonte las cuerdas con división, pero debe haber una manera más elegante.
Esta es la forma estándar, según perldoc perldsc .
~> more test.pl
%chums = ( "Allan" => {"Boss" => "George", "Status" => "Contractor"},
"Bob" => {"Boss" => "Peter", "Status" => "Part-time"} );
print $chums{"Allan"}{"Boss"}."/n";
print $chums{"Bob"}{"Boss"}."/n";
print $chums{"Bob"}{"Status"}."/n";
$chums{"Bob"}{"Wife"} = "Pam";
print $chums{"Bob"}{"Wife"}."/n";
~> perl test.pl
George
Peter
Part-time
Pam
Hashes of hashes es lo que estás pidiendo explícitamente. Hay una pieza de documentación del estilo del tutorial que forma parte de la documentación de Perl que cubre esto: Libro de cocina de estructura de datos. Pero tal vez debería considerar ir orientado a objetos. Este es un ejemplo estereotípico para los tutoriales de programación orientada a objetos.
Qué tal algo como esto:
#!/usr/bin/perl
package Employee;
use Moose;
has ''name'' => ( is => ''rw'', isa => ''Str'' );
# should really use a Status class
has ''status'' => ( is => ''rw'', isa => ''Str'' );
has ''superior'' => (
is => ''rw'',
isa => ''Employee'',
default => undef,
);
###############
package main;
use strict;
use warnings;
my %employees; # maybe use a class for this, too
$employees{George} = Employee->new(
name => ''George'',
status => ''Boss'',
);
$employees{Allan} = Employee->new(
name => ''Allan'',
status => ''Contractor'',
superior => $employees{George},
);
print $employees{Allan}->superior->name, "/n";
Hashes puede contener otros hashes o matrices. Si desea hacer referencia a sus propiedades por su nombre, guárdelas como un hash por clave; de lo contrario, guárdelas como una matriz por clave.
Hay una referencia para la sintaxis .
my %employees = (
"Allan" => { "Boss" => "George", "Status" => "Contractor" },
);
print $employees{"Allan"}{"Boss"}, "/n";