2008-10-10 15 views
24

हाल तक मैं एक ही कुंजी के साथ विभिन्न हैश में एकाधिक मान निम्नानुसार भंडारण किया गया है:मैं पर्ल हैश तालिका में एकाधिक मान कैसे संग्रहीत कर सकता हूं?

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

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

और फिर मैं $boss("Bob") और $status("Bob") संदर्भित कर सकते हैं लेकिन यह बोझल हो जाता है अगर वहाँ गुण प्रत्येक कुंजी के लिए बहुत कुछ है हो सकता है और मुझे हैश को सिंक में रखने के बारे में चिंता करने की ज़रूरत है।

क्या हैश में एकाधिक मान संग्रहीत करने का कोई बेहतर तरीका है? मैं के रूप में

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

मान संग्रहीत कर सकता है और उसके बाद विभाजन के साथ तार एकत्रित न, लेकिन एक और अधिक सुरुचिपूर्ण तरीका होना चाहिए।

+1

यह एक महान अनुस्मारक है कि पर्ल डेटा संरचना कुकबुक इतना महान संसाधन क्यों है। – dreftymac

उत्तर

26

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

यह ठीक दिखता है। मुझे लगता है कि मैं $ chums {"ग्रेग"} = {"बॉस" => "लिसा", "स्थिति" => "निकाल दिया गया"} के साथ एक और चुम जोड़ सकता हूं लेकिन मैं बॉब को पत्नी जोड़ने के बारे में कैसे जा सकता हूं? क्या यह $ chums {"बॉब"} {"पत्नी"} = "कैरल" होगा? – paxdiablo

+0

इसके अलावा, "->" क्यों। ऐसा लगता है कि इनके बिना काम करना है। – paxdiablo

+2

टिमटोडी :), आप इसका उपयोग बिना उनके कर सकते हैं, और हाँ, पत्नी जोड़ने का आपका तरीका सही है –

3

हैश में अन्य हैंश या सरणी हो सकती हैं। यदि आप अपनी संपत्तियों को नाम से संदर्भित करना चाहते हैं, तो उन्हें प्रति हैश के रूप में स्टोर करें, अन्यथा उन्हें प्रति कुंजी सरणी के रूप में स्टोर करें।

reference for the syntax है।

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

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

हैश का हैश वह है जिसे आप स्पष्ट रूप से पूछ रहे हैं। पर्ल दस्तावेज़ के प्रलेखन भाग का एक ट्यूटोरियल स्टाइल टुकड़ा है जिसमें यह शामिल है: Data Structure Cookbook लेकिन शायद आपको ऑब्जेक्ट-ओरिएंटेड जाने पर विचार करना चाहिए। ऑब्जेक्ट उन्मुख प्रोग्रामिंग ट्यूटोरियल के लिए यह स्टीरियोटाइपिकल उदाहरण है।

कैसे कुछ इस तरह के बारे में:

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

इसका लाभ यह है कि इसे भविष्य में बढ़ाया जा सकता है। –

0

% chums = ("एलन" => { "बॉस" => "जॉर्ज", "स्थिति" => "ठेकेदार"}, "बॉब" => {"बॉस" => "पीटर", "स्थिति" => "अंशकालिक"});

अच्छा काम करता है लेकिन क्या डेटा दर्ज करने का कोई तेज़ तरीका है?

मैं

% chums की तरह कुछ की सोच रहा हूँ = (QW, एक्स) (एलन बॉस जॉर्ज स्थिति ठेकेदार बॉब बॉस पीटर स्थिति अंशकालिक)

जहां एक्स = माध्यमिक कुंजियों की संख्या के बाद प्राथमिक कुंजी, इस मामले में x = 2, "बॉस" और "स्थिति"

संबंधित मुद्दे