2011-10-26 10 views
5

मुझे कोई समस्या है जहां संख्याओं के जोड़े संख्याओं के अन्य जोड़े को मानचित्र करते हैं। उदाहरण के लिए, (1,2) -> (12, 9 7)। कुछ जोड़े कई अन्य जोड़े को मैप कर सकते हैं, इसलिए मुझे वास्तव में जो कुछ चाहिए वह सूचियों की सूची में एक जोड़ी को मैप करने की क्षमता है, जैसे (1,2) -> ((12, 9 7), (4,1))। दिन के अंत में मैं अलग-अलग मूल्यों (यानी, सूचियों की प्रत्येक सूची) को अलग से संसाधित करना चाहता हूं।पर्ल हैश जब दोनों कुंजी और मान सरणी संदर्भ हैं

अजगर में, मैं बस कह कर ऐसा कर सकता है:

key = (x, y) 
val = [ a, b ] 
if (x,y) not in my_dict: 
    my_dict[ (x,y) ] = [] 
my_dict[ (x,y) ].append([a,b]) 

हालांकि, पर्ल में, मैं कुंजी और मूल्यों के लिए refs उपयोग करना होगा। तो मैं निश्चित रूप से कह सकता हूं:

$keyref = [ x1, y1 ] 
$valref = [ a, b ] 
%my_hash = { $keyref => $valref } 

लेकिन क्या होता है जब एक और जोड़ी (x2, y2) साथ आती है? यहां तक ​​कि यदि x2 == x1 और y2 == y1, $ keyref = [x2, y2] उत्पन्न किए गए पिछले कीफ से अलग होंगे, इसलिए मुझे लुकअप करने का कोई तरीका नहीं दिख रहा है। बेशक, मैं प्रत्येक dereferenced हैश कुंजी के साथ (x2, y2) की तुलना कर सकता हूं, लेकिन आखिरकार, भगवान ने हमें ऐसा करने की आवश्यकता से बचने के लिए हैश टेबल दिया है।

क्या कोई पर्ल समाधान है?

धन्यवाद,

-W।

+0

आप एक कुंजी के रूप में संदर्भ का उपयोग नहीं कर सकते हैं। (कम से कम नहीं * बिना * बंधे * हैश का उपयोग किए बिना –

उत्तर

0

मैं सॉकेट कठपुतली के समाधान का उपयोग कर समाप्त हो गया (में प्रयोग करें माइकल कारमेन के विकल्प 3 का रूप)। एफवाईआई, यहां एक छोटी पर्ल स्क्रिप्ट है जो मेरे ऐप में आवश्यक सभी कार्यों को पूरा करती है।

मुद्रित लाइन 2:, 3: और 4:, 5: एक ही चीज़ करने के लिए बस अलग वाक्यविन्यास का उपयोग करें, और रेखा 0: और 1: केवल सैनिटी चेक के रूप में इरादा किया गया था।

यह सुझाए गए समाधान में यह क्या जोड़ता है वह सरणी के सरणी के रूप में एक कुंजी के साथ जाने वाले मान के रूप में उपयोग होता है।

@k1 = (12, 13); 
$aref = [ 11, 22 ]; 
$bref = [ 33, 44 ]; 
%h = {}; 
if(not exists $h{$k1[0]}{$k1[1]}) { 
    print "initializing\n"; 
    $h{$k1[0]}{$k1[1]} = []; 
} 
push @{$h{$k1[0]}{$k1[1]}}, $aref; 
push @{$h{$k1[0]}{$k1[1]}}, $bref; 
print "0: ", join ':', @{$h{$k1[0]}{$k1[1]}}, "\n"; 
print "1: ", join ':', ${$h{$k1[0]}{$k1[1]}}[0], "\n"; 
print "2: ", join ':', @{${$h{$k1[0]}{$k1[1]}}[0]}, "\n"; 
print "3: ", join ':', @{${$h{$k1[0]}{$k1[1]}}[1]}, "\n"; 
print "4: ", join ':', @{$h{$k1[0]}{$k1[1]}->[0]}, "\n"; 
print "5: ", join ':', @{$h{$k1[0]}{$k1[1]}->[1]}, "\n"; 

पीएस मैंने इसे एक टिप्पणी के रूप में जोड़ा होगा लेकिन यह बहुत लंबा था, और मैंने सोचा कि यह एक काम किया उदाहरण शामिल करने के लिए समझ में आया।

+0

समाधान पर बधाई। जब आप सक्षम होते हैं, तो कृपया अपने उत्तर को 'स्वीकृत' के रूप में चिह्नित करना सुनिश्चित करें ताकि अन्य आपकी सफलता से सीख सकें। चीयर्स ~ –

10

पर्ल में, सभी हैश कुंजी तार हैं, या लुकअप से पहले "स्ट्रिंगिफाइड" हैं। एक कुंजी के रूप में एक सरणी संदर्भ का उपयोग आमतौर पर गलत दृष्टिकोण है।

"द्वि-आयामी" हैश का उपयोग करने के बारे में क्या?

$hash{$x1}{$y1} = [ $a, $b ]; 
# or 
%hash = ($x1 => { $y1 => [ $a, $b ] }); 


($x2,$y2)=($x1,$y1); 
print @{$hash{$x2}{$y2}}; # will print $a and $b 
+0

शानदार! धन्यवाद। – wchlm

2

पर्ल, TMTOWTDI में अधिकांश चीजों की तरह।

विकल्प 1: बहुआयामी सरणी अनुकरण

$hash{$x,$y} = [$a, $b]; 

उपयोग के लिए यह भी देखें प्रलेखन अंतर्निहित वैरिएबल $;

विकल्प 2: का प्रयोग करें Hash::MultiKey मॉड्यूल

tie %hash, 'Hash::MultiKey'; 
$hash{[$x, $y]} = [$a, $b]; 

विकल्प 3: किसी Höh (हैश के हैश) के बजाय

$hash{$x}{$y} = [$a, $b]; 
+0

मैं सॉकेट कठपुतली के समाधान (आपके विकल्प 3 के रूप में) का उपयोग कर समाप्त हुआ। एफवाईआई, यहां एक छोटी पर्ल स्क्रिप्ट है जो मेरे ऐप में किए जाने वाले सभी कार्यों को पूरा करती है। मुद्रित लाइन 2:, 3: और 4:, 5: एक ही चीजों को करने के लिए बस अलग वाक्यविन्यास का उपयोग करें, और 0: और 1: बस सैनिटी चेक के रूप में इरादे से थे। इन उदाहरणों में जो एकमात्र चीज जोड़ती है वह चाबियों के साथ चलने वाले मान के रूप में सरणी के सरणी का उपयोग होता है। – wchlm

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