2008-10-10 9 views
24

Bis vor kurzem habe ich mehrere Werte wurden Speicherung in verschiedene Hashes mit den gleichen Tasten wie folgt: jede TasteWie kann ich mehrere Werte in einer Perl-Hash-Tabelle speichern?

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

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

und dann kann ich Referenz $boss("Bob") und $status("Bob") aber dies wird unhandlich, wenn es eine Menge von Eigenschaften kann haben und ich muss mir Sorgen machen, die Hashes synchron zu halten.

Gibt es eine bessere Möglichkeit, mehrere Werte in einem Hash zu speichern? Ich könnte die Werte als

speichern und dann die Saiten mit Split zerlegen, aber es muss einen eleganteren Weg geben.

+1

Dies ist eine großartige Erinnerung, warum die Perl Data Struktur Kochbuch ist so eine große Ressource. – dreftymac

Antwort

26

Dies ist der Standard Weg, wie 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

Das sieht gut aus. Ich schätze, ich kann ein weiteres Kumpel mit $ chums {"Greg"} = {"Boss" => "Lisa", "Status" => "Fired"} hinzufügen, aber wie gehe ich vor, um eine Frau zu Bob hinzuzufügen? Wäre das $ chums {"Bob"} {"Wife"} = "Carol"? – paxdiablo

+0

Auch warum das "->". Es scheint ohne diese zu funktionieren. – paxdiablo

+2

TIMTOWDI :), Sie können es ohne sie verwenden, und ja, Ihre Art, eine Frau hinzuzufügen ist korrekt –

3

Hashes können andere Hashes oder Arrays enthalten. Wenn Sie auf Ihre Eigenschaften nach Namen verweisen möchten, speichern Sie sie als Hash pro Schlüssel, andernfalls speichern Sie sie als ein Array pro Schlüssel.

Es gibt eine reference for the syntax.

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

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

Hashes von Hashes ist, was Sie explizit fordern. Es gibt einen Tutorial-Teil der Dokumentation Teil der Perl-Dokumentation, die dies abdeckt: Data Structure Cookbook Aber vielleicht sollten Sie in Betracht ziehen, objektorientiert zu gehen. Dies ist eine Art stereotypes Beispiel für objektorientierte Programmierungstutorials.

Wie wäre es etwa so:

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

Dies hat den Vorteil, dass es in Zukunft verbessert werden kann. –

0

% chums = ("Allan" => { "Boss" => "George", "Status" => "Auftragnehmer"}, "Bob" => {"Boss" => "Peter", "Status" => "Teilzeit"});

funktioniert gut, aber gibt es eine schnellere Möglichkeit, die Daten einzugeben?

Ich denke an so etwas wie

% chums = (QW, x) (Allan Boss George Der Status Auftragnehmer Bob Boss Peter-Status Teilzeit)

wobei x = die Anzahl der Sekundärschlüssel nach dem Primärschlüssel, in diesem Fall x = 2, "Chef" und "Status"

Verwandte Themen