2009-07-21 14 views
22

मुझे कुछ अतिरिक्त कार्यक्षमता जोड़ने के लिए कुछ मौजूदा कोड को संशोधित करने के लिए कहा गया था। मैंने Google पर खोज की है और मुझे जवाब नहीं मिल रहा है। मैं इस आशय के लिए कुछ है ...पर्ल में सबराउटिन के लिए तर्क के रूप में हैश का उपयोग कैसे कर सकता हूं?

%first_hash = gen_first_hash(); 
%second_hash = gen_second_hash(); 
do_stuff_with_hashes(%first_hash, %second_hash); 

sub do_stuff_with_hashes 
{ 
    my %first_hash = shift; 
    my %second_hash = shift; 

    # do stuff with the hashes 
} 

मैं निम्नलिखित त्रुटियाँ हो रही है:

Odd number of elements in hash assignment at ./gen.pl line 85. 
Odd number of elements in hash assignment at ./gen.pl line 86. 
Use of uninitialized value in concatenation (.) or string at ./gen.pl line 124. 
Use of uninitialized value in concatenation (.) or string at ./gen.pl line 143. 

लाइन 85 और 86 उप दिनचर्या में पहले दो लाइनें हैं और 124 और 143 हैं, जहां मैं हैश का उपयोग कर रहा हूँ। जब मैं उन त्रुटियों को देखता हूं तो ऐसा लगता है कि मेरे हैंश अनियमित हैं। हालांकि, मैं सत्यापित कर सकता हूं कि हैंश के पास मूल्य हैं। मुझे इन त्रुटियों को क्यों मिल रहा है?

+1

यह डुप्लिकेट है। कृपया http://stackoverflow.com/questions/944784/ – innaM

उत्तर

24

जब आप उन्हें फ़ंक्शन में पास करते हैं तो हैश को फ्लैट सूचियों में ध्वस्त किया जा रहा है। इसलिए, जब आप फ़ंक्शन के तर्कों से कोई मान हटाते हैं, तो आपको केवल एक मान मिल रहा है। आप क्या करना चाहते हैं संदर्भ के द्वारा हैश पास है।

do_stuff_with_hashes(\%first_hash, \%second_hash); 

लेकिन फिर आपको हैश के साथ संदर्भ के रूप में काम करना होगा।

my $first_hash = shift; 
my $second_hash = shift; 
+0

पर एक नज़र मैं देख रहा हूँ ले ... यही कारण है कि चाल ... बहुत बहुत धन्यवाद किया! – predhme

5
सबसे पहले

,

do_stuff_with_hashes(%first_hash, %second_hash); 

"धाराओं" एक सूची में हैश, के बराबर:

('key1_1', 'value1', ... , 'key1_n', 'value1_n', 'key2_1', 'value2_1', ...) 

और फिर आप एक और उन वस्तुओं का केवल एक का चयन करें। तो,

my %first_hash = shift; 

कह की तरह है:

my %first_hash = 'key1_1'; 
# leaving ('value1', ... , 'key1_n', 'value1_n', 'key2_1', 'value2_1', ...) 

आप { 'key1' } की तरह एक हैश नहीं हो सकता है, के बाद से कुछ भी नहीं 'key1' के लिए मानचित्रण है।

+1

समझा पर्दे के पीछे क्या चल रहा था के लिए धन्यवाद। – predhme

9

हैश संदर्भ जाने का तरीका हैं, जैसा कि अन्य ने बताया है।

सिर्फ किक्स के लिए ऐसा करने का एक और तरीका प्रदान करना ... क्योंकि अस्थायी चर की आवश्यकता कौन है?

do_stuff_with_hashes({ gen_first_hash() }, { gen_second_hash() }); 

यहाँ आप सिर्फ मक्खी (फ़ंक्शन कॉल के आसपास कर्ली कोष्ठक के माध्यम से) पर हैश संदर्भ पैदा कर रहे अपने do_stuff_with_hashes समारोह में उपयोग करने के लिए। यह कुछ खास नहीं है, अन्य विधियां उतनी ही वैध और शायद अधिक स्पष्ट हैं। अगर आप अपनी यात्रा में इस गतिविधि को पर्ल के लिए नए व्यक्ति के रूप में देखते हैं तो यह सड़क की मदद कर सकता है।

+0

ग्रेट चाल! मैं इसे चारों ओर रखता हूँ। – predhme

+0

oblige करने के लिए खुश। यदि आप पर्ल में घूमते हैं तो ध्यान में रखना एक बात यह है कि हर कोई यह बताएगा कि "ऐसा करने के एक से अधिक तरीके हैं"। पर्ल प्रोग्रामिंग में ऐसी चीजों की आपकी राय के आधार पर यह एक आशीर्वाद और शाप है)। मज़े करो! –

14

थोड़ा देर से लेकिन,

के रूप में कहा गया है, तो आप संदर्भ, नहीं हैश गुजरना होगा।

do_stuff_with_hashes(\%first_hash, \%second_hash); 

लेकिन यदि आपको अपनी हैश का उपयोग करना/चाहना है, तो आप उन्हें अनावश्यक रूप से अस्वीकार कर सकते हैं।

sub do_stuff_with_hashes { 
    my %first_hash = %{shift()}; 
    my %second_hash = %{shift()}; 
}; 
+0

स्पष्ट होने के लिए, मैं हैश को अस्वीकार नहीं कर रहा हूं, मैं उन्हें कॉपी कर रहा हूं। – larelogio

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

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