मैं पर्ल में हैश को कैसे जोड़ सकता हूं?


95

दोनों हैश को% हैश 1 में संयोजित करने का सबसे अच्छा तरीका क्या है? मुझे हमेशा पता है कि% हैश 2 और% हैश 1 में हमेशा अद्वितीय कुंजी होती है। यदि संभव हो तो मैं कोड की एक पंक्ति भी पसंद करूंगा।

$hash1{'1'} = 'red';
$hash1{'2'} = 'blue';
$hash2{'3'} = 'green';
$hash2{'4'} = 'yellow';

जवाबों:


168

त्वरित उत्तर (TL; DR)

    % हैश १ = (% हैश १,% हैश २)

    ## वरना ...

    @ hash1 {चाबियाँ% hash2} = मान% hash2;

    ## या संदर्भ के साथ ...

    $ hash_ref1 = {% $ hash_ref1,% $ hash_ref2};

अवलोकन

  • संदर्भ: पर्ल 5.x
  • समस्या: उपयोगकर्ता दो हैश 1 को एक एकल चर में विलय करना चाहता है

उपाय

  • सरल चर के लिए ऊपर सिंटैक्स का उपयोग करें
  • हैश का उपयोग करें: जटिल नेस्टेड चर के लिए मर्ज करें

नुकसान

यह सभी देखें


फुटनोट

1 * (उर्फ सहयोगी-सरणी , उर्फ शब्दकोश )


2
हां, यदि कोई महत्वपूर्ण टक्कर नहीं है, तो @ hash1 {चाबियाँ% hash2} = मान% hash2; सबसे तेज़ और सबसे छोटा रास्ता है, AFAIK।
kixx 20

46
आप सिर्फ ऐसा क्यों नहीं कर सकते%hash1 = (%hash1, %hash2)
user102008

1
यह संदर्भों के साथ भी काम करने लगता है: $ hash_ref1 = ($ hash_ref1, $ hash_ref2);
लेप

2
यही कारण है कि सेट हो जाएगा $hash_ref1करने के लिए $hash_ref2, मिलाने की। आप चाहते हैं $hash_ref1 = { %$hash_ref1, %$hash_ref2 };, मैं उत्तर संपादित करूँगा।
एम सोमरविले

38

Perlfaq4 की जाँच करें: मैं दो हैश का विलय कैसे करूँ । पर्ल दस्तावेज़ में पहले से ही बहुत सारी अच्छी जानकारी है और आप इसका जवाब देने के लिए किसी और की प्रतीक्षा करने के बजाय इसे तुरंत दूर कर सकते हैं। :)


इससे पहले कि आप दो हैश का विलय करने का फैसला करें, आपको यह तय करना होगा कि दोनों हैश में क्या कुंजी हैं जो समान हैं और यदि आप मूल हैश को छोड़ना चाहते हैं तो वे क्या हैं।

यदि आप मूल हैश को संरक्षित करना चाहते हैं, तो एक हैश (% हैश 1) को एक नए हैश (% new_hash) पर कॉपी करें, फिर अन्य हैश से कुंजी जोड़ें (% हैश 2 से नए हैश की जाँच करें। जाँच कर रहे हैं कि कुंजी पहले से ही% new_hash में मौजूद है। आपको डुप्लिकेट के साथ क्या करने का फैसला करने का मौका देता है:

my %new_hash = %hash1; # make a copy; leave %hash1 alone

foreach my $key2 ( keys %hash2 )
    {
    if( exists $new_hash{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $new_hash{$key2} = $hash2{$key2};
        }
    }

यदि आप नया हैश नहीं बनाना चाहते हैं, तब भी आप इस लूपिंग तकनीक का उपयोग कर सकते हैं; बस% new_hash को% हैश 1 में बदलें।

foreach my $key2 ( keys %hash2 )
    {
    if( exists $hash1{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $hash1{$key2} = $hash2{$key2};
        }
    }

अगर आपको परवाह नहीं है कि एक हैश दूसरे से कुंजियों और मूल्यों को अधिलेखित करता है, तो आप एक हैश स्लाइस का उपयोग दूसरे में एक हैश जोड़ने के लिए कर सकते हैं। इस मामले में,% हैश 2 के मान% हैश 1 से मानों को प्रतिस्थापित करते हैं जब उनके पास सामान्य रूप से चाबियाँ होती हैं:

@hash1{ keys %hash2 } = values %hash2;

perlfaq, और अन्य संसाधनों को अन्य प्रश्न से जोड़ने के लिए अच्छा है
क्रिस

14

यह एक पुराना प्रश्न है, लेकिन 'पर्ल मर्ज हैश' के लिए मेरी Google खोज में उच्च है - और फिर भी यह बहुत उपयोगी CPAN मॉड्यूल हैश का उल्लेख नहीं करता है :: मर्ज


इसे शामिल करने के लिए शीर्ष-वोट किए गए उत्तर को अपडेट किया गया है।
dreftymac

6

हैश संदर्भों के लिए। आपको निम्न की तरह घुंघराले ब्रेसिज़ का उपयोग करना चाहिए:

$hash_ref1 = {%$hash_ref1, %$hash_ref2};

और कोष्ठक के उपयोग से ऊपर सुझाया गया उत्तर नहीं :

$hash_ref1 = ($hash_ref1, $hash_ref2);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.