2008-10-10 10 views
24

Jusqu'à récemment, j'ai été stocke plusieurs valeurs dans différentes hash avec les mêmes touches comme suit:Comment puis-je stocker plusieurs valeurs dans une table de hachage Perl?

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

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

puis je peux faire référence à $boss("Bob") et $status("Bob"), mais cela devient difficile à manier s'il y a beaucoup de propriétés chaque clé peut avoir et je dois me soucier de garder les hachages en synchronisation.

Existe-t-il un meilleur moyen de stocker plusieurs valeurs dans un hachage? Je pouvais stocker les valeurs

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

puis démonte les cordes avec Split, mais il doit y avoir une façon plus élégante.

+1

Ceci est un excellent rappel de la raison pour laquelle le livre de recettes de structure Perl Data est une excellente ressource. – dreftymac

Répondre

26

Ceci est la manière standard, selon 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

Cela semble correct. Je suppose que je peux ajouter un autre chum avec $ chums {"Greg"} = {"Boss" => "Lisa", "Status" => "Fired"} mais comment puis-je ajouter une femme à Bob? Serait-ce $ chums {"Bob"} {"Femme"} = "Carol"? – paxdiablo

+0

Aussi, pourquoi le "->". Il semble fonctionner sans cela. – paxdiablo

+2

TIMTOWDI :), vous pouvez l'utiliser sans eux, et oui, votre façon d'ajouter une femme est correcte –

3

Les hachages peuvent contenir d'autres hachages ou matrices. Si vous souhaitez référencer vos propriétés par nom, stockez-les sous forme de hachage par clé, sinon stockez-les en tant que tableau par clé. Il s'agit d'un reference for the syntax.

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

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

Les hachages de hachages sont ce que vous demandez explicitement. Il y a une partie de la documentation de style tutoriel de la documentation Perl qui couvre ceci: Data Structure Cookbook Mais peut-être que vous devriez envisager d'aller vers les objets. C'est en quelque sorte l'exemple stéréotypé pour les tutoriels de programmation orientés objet.

Que diriez-vous quelque chose comme ceci:

#!/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

Cela a l'avantage qu'il peut être amélioré à l'avenir. –

0

% chums = ("Allan" => { "Boss" => "George", "Status" => "entrepreneur"}, "Bob" => {"Boss" => "Peter", "Status" => "À temps partiel"});

fonctionne très bien mais existe-t-il un moyen plus rapide de saisir les données?

Je pense à quelque chose comme

% chums = (QW, x) (Allan patron George Status entrepreneur Bob patron Peter Statut à temps partiel)

où x = le nombre de clés secondaires après la clé primaire, dans ce cas x = 2, "Boss" et "Status"

Questions connexes