2008-10-10 34 views
24

Hasta hace poco, he estado almacenar múltiples valores en diferentes hashes con las mismas claves de la siguiente manera:¿Cómo puedo almacenar múltiples valores en una tabla hash Perl?

%boss = (
    "Allan" => "George", 
    "Bob" => "George", 
    "George" => "lisa"); 

%status = (
    "Allan" => "Contractor", 
    "Bob" => "Part-time", 
    "George" => "Full-time"); 

y luego puede hacer referencia a $boss("Bob") y $status("Bob") pero ahora se pone difícil de manejar si hay una gran cantidad de propiedades de cada clave puede tener y tengo que preocuparme por mantener los hashes sincronizados.

¿Existe alguna forma mejor de almacenar valores múltiples en un hash? Podría almacenar los valores como

 "Bob" => "George:Part-time" 

y luego desmonte las cuerdas con split, pero tiene que haber una forma más elegante.

+1

Este es un gran recordatorio de por qué el libro de cocina de estructura de datos Perl es un gran recurso. – dreftymac

Respuesta

26

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 
+0

Eso se ve bien. Supongo que puedo agregar otro amigo con $ chums {"Greg"} = {"Boss" => "Lisa", "Estado" => "Despedido"}, pero ¿cómo hago para agregarle una esposa a Bob? ¿Sería eso $ chums {"Bob"} {"Wife"} = "Carol"? – paxdiablo

+0

Además, por qué el "->". Parece funcionar sin estos. – paxdiablo

+2

TIMTOWDI :), puede usarlo sin ellos, y sí, su forma de agregar una esposa es correcta –

3

Hashes puede contener otros valores hash o arreglos. 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 un reference for the syntax.

2
my %employees = (
    "Allan" => { "Boss" => "George", "Status" => "Contractor" }, 
); 

print $employees{"Allan"}{"Boss"}, "\n"; 
23

Hashes of hashes es lo que está solicitando explícitamente. Existe una pieza de documentación del estilo del tutorial que forma parte de la documentación de Perl que cubre esto: Data Structure Cookbook. 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"; 
+2

Esto tiene la ventaja de que se puede mejorar en el futuro. –

0

% chums = ("Allan" => { "Boss" => "George", "Estado" => "contratista"}, "Bob" => {"Jefe" => "Peter", "Estado" => "Tiempo parcial"});

funciona muy bien, pero ¿hay una forma más rápida de ingresar los datos?

Estoy pensando en algo así como

% chums = (QW, x) (Allan jefe George Estado contratista Bob jefe Pedro de estado 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"

Cuestiones relacionadas