2008-10-10 11 views
24

, ben aynı tuşlarıyla farklı sağlamalarının içine birden çok değer saklama oldum:Perl hash tablosunda birden çok değeri nasıl saklayabilirim? aşağıdaki gibi yakın zamana kadar

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

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

ve özelliklerinin her anahtar bir sürü varsa o zaman ben $boss("Bob") ve $status("Bob") başvurabilir ama bu hantallaşır karmaşıkları senkronize tutmak konusunda endişelenebilirim ve endişelenmeliyim.

Bir hashta birden çok değer depolamak için daha iyi bir yolu var mı? Ben

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

gibi değerleri depolamak ve daha sonra bölünmüş dizelerle sökmeye ancak daha zarif bir yolu olmalı olabilir.

+1

Perl Data yapısı yemek kitabının neden bu kadar büyük bir kaynak olduğunu anımsatmak büyük bir hatırlatmadır. – dreftymac

cevap

26

Bu, perldoc perldsc'a göre standart yoldur.

+0

Bu iyi görünüyor. Sanırım $ chums ile başka bir chum ekleyebilirim {"Greg"} = {"Patron" => "Lisa", "Status" => "Fired"} ama Bob'a bir eş eklemekten nasıl bahsederim? Bu $ chums {"Bob"} {"Karısı"} = "Carol" olur mu? – paxdiablo

+0

Ayrıca, neden "->". Bunlar olmadan işlev görüyor. – paxdiablo

+2

TIMTOWDI :), onlar olmadan bunları kullanabilirsiniz ve evet, bir karısı eklemek için yol doğru –

3

Diğer karmalar veya diziler içerebilir. Mülkünüze ismine göre bakmak istiyorsanız, bunları anahtar başına bir karma olarak saklayın, aksi takdirde bunları anahtar başına bir dizi olarak saklayın. Bir reference for the syntax var.

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

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

Şüphelerin karmaşası, açıkça sorduğunuz şeydir. Perl belgelerinin bir parçası olan öğretici bir stil parçası vardır, bunu kapsayan: Data Structure Cookbook Ama belki nesneye yönelmeyi düşünmelisiniz. Bu, nesne yönelimli programlama eğiticileri için basmakalıp bir örnektir.

Nasıl böyle bir şey hakkında:

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

Bu, gelecekte geliştirilebileceği yararına sahiptir. –

0

% chums = ("Allan" => { "Patron" => "George", "Durum" => "Müteahhit"}, "Bob" => {"Patron" => "Peter", "Durum" => "Yarı zamanlı"});

harika çalışıyor ancak verileri girmenin daha hızlı bir yolu var mı?

Ben

% chums gibi bir şey düşünüyorum = (qw, x) (Allan Patron George Durum Müteahhit Bob Boss Peter Durum Part-time)

nerede ikincil tuşlarının x = sayı sonra birincil anahtar, bu durumda x = 2, "Patron" ve "Durum"

İlgili konular