2013-06-13 8 views
5

के रूप में एक सरणी के साथ एक पर्ल हैश बनाएं, मैं पर्ले में हैश में एक सरणी (जैसे उदाहरण में टुपल) कैसे डाल सकता हूं?कुंजी

%h=(); 
@a=(1,1); 
$h{@a}=1 or $h{\@a}=1?? 

मैंने एक सरणी संदर्भ के साथ प्रयास किया, लेकिन यह काम नहीं करता है। मैं इसे कैसे काम करूं? मैं अनिवार्य रूप से हैशिंग (इसके साथ अन्य चीजों के साथ) करके डी-डुप्लिकेट करना चाहता हूं।

+0

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

+0

क्या आप कृपया एक उदाहरण दे सकते हैं? –

+0

यह संभव नहीं है: सभी चाबियाँ तार होनी चाहिए। हालांकि आप किसी ऐसे चरित्र के साथ एक कुंजी बनाने के लिए सरणी के हिस्सों में शामिल हो सकते हैं जो आप गारंटी दे सकते हैं मूल्यों में प्रकट नहीं होंगे। यह एक एनयूएल बाइट हो सकता है: '$ एच {शामिल हों \ x00", @ ए} = 1'। – amon

उत्तर

9

नियमित हैश में केवल स्ट्रिंग कुंजी हो सकती है, इसलिए आपको अपने सरणी के लिए किसी प्रकार का हैशिंग फ़ंक्शन बनाना होगा। एक आसान तरीका join आपके सरणी तत्वों, उदाहरण के लिए होगा

$h{join('-', @a)} = \@a; # A nice readable separator 
$h{join($;, @a)} = \@a; # A less likely, configurable separator ("\034") 

लेकिन उस दृष्टिकोण (एक सेंटीनेल मूल्य का उपयोग करके) के लिए आवश्यक है कि आप एक ऐसा चरित्र चुनें जो कुंजी में नहीं मिलेगा। वैकल्पिक रूप से

$h{pack('(j/a*)*', @a)} = \@a; 

, Hash::MultiKey जो एक अधिक जटिल कुंजी ले जा सकते हैं की जाँच: निम्नलिखित है कि समस्या से ग्रस्त नहीं है।

+0

मैंने कुछ और विवरण जोड़े। मुझे आशा है कि आपको बुरा लगेगा। – ikegami

3

मैं सरणी संदर्भ के साथ करने की कोशिश की, लेकिन यह काम नहीं करता है (नया) ऊंट पुस्तक के पृष्ठ 361 अनुच्छेद शीर्षक है

अजीब बात है कि,: संदर्भ के रूप में हैश कुंजी

काम न करें

तो हाँ, आपने ऊंट पुस्तक को सही साबित कर दिया। यह Tie::RefHash का उपयोग करके, इसे ठीक करने के तरीके के बारे में बताने के लिए आगे बढ़ता है।

मुझे लगता है कि आपको पुस्तक खरीदनी चाहिए।

(वैसे, (1,1) को पायथन में एक टुपल कहा जा सकता है, लेकिन इसे पर्ल में एक सूची कहा जाता है)।

1

हैश के उपयोग सरणी में डुप्लिकेट निकालने के लिए:

my %hash; 
@hash{@array} = @array; 
my @unique = keys %hash; 

वैकल्पिक रूप से, आप हैश बनाने के लिए map उपयोग कर सकते हैं:

my %hash = map {$_ => 1} @array; 
+0

-1: एक हैश कुंजी के रूप में गैर-स्केलर मान का उपयोग करने के लिए ओपी की असमर्थता को संबोधित नहीं करता है। –

+0

मैं अलग होना चाहता हूं। यह अपने असली प्रश्न (पोस्ट के अंत में) से संबंधित है जो एक सरणी को समर्पित करने के लिए हैश का उपयोग करना है। इससे मुझे पता चलता है कि वह हैशकी के रूप में सरणी सेट करके हासिल करने का प्रयास कर रहा है, हैश में प्रत्येक तत्व को हैश में एक अलग कुंजी के रूप में असाइन करना है। – stevenl

+0

सहमत है कि यह दिखाता है कि हैश का उपयोग करके डेटा सेट को कैसे घटाया जाए, लेकिन सवाल का मेरा पठन यह है कि सेट में डेटा तत्व टुपल हैं, न कि प्रत्येक ट्यूपल के तत्व। इसलिए, यदि वह tuples को चाबियों के रूप में उपयोग नहीं कर सकता है, तो dedup के लिए 'keys' का उपयोग करना संभव नहीं है। शायद ओपी स्पष्ट कर सकता है कि वह वास्तव में क्या कर रहा है? –