2011-02-04 11 views
7

मैं एक हैश को उप-फ़ंक्शंस के संदर्भ में रखना चाहता हूं जहां मैं उन कार्यों को उपयोगकर्ता परिभाषित चर पर निर्भर कर सकता हूं, मैं कोशिश करूँगा और जो मैं करने की कोशिश कर रहा हूं उसका सरलीकृत उदाहरण दूंगा।सबफंक्शंस के पर्ल हैश

my %colors = (
    vim => setup_vim(), 
    emacs => setup_emacs(), 
) 

$colors{$editor}(arg1, arg2, arg3) 

जहां setup_vim() और setup_emacs() उप कार्यों मेरी फाइल और $editor में बाद में परिभाषित किया जाएगा एक उपयोगकर्ता निर्धारित चर (यानी vim या Emacs) है। क्या यह संभव है? मैं इसे काम नहीं कर सकता, या विषय पर अच्छी जानकारी पा सकता हूं। धन्यवाद।

(ध्यान दें मैं अभी लागू किया एक काम स्विच के रूप में है, लेकिन मुझे लगता है कि जैसे एक हैश ऊपर अपने मौजूदा कोड करने के लिए नए प्रविष्टियों को जोड़ने के लिए यह आसान होगा)

उत्तर

16

यहाँ वाक्य रचना है।

my %colors = (
    vim => \&setup_vim, 
    emacs => \&setup_emacs, 
); 

$colors{$editor}(@args) 

ध्यान दें कि आप वास्तव में सीधे

my %colors = (
    vim => sub {...}, 
    emacs => sub {...}, 
); 

साथ और अगर आप बंद से परिचित हैं कार्यों बना सकते हैं, पर्ल चर lexically घोषित किया गया है, जो आप के साथ कर सकते के लिए पूर्ण बंद का समर्थन करता है मेरी ।

+0

आप दोनों के लिए धन्यवाद, यह ठीक काम कर रहा है। मुझे यकीन नहीं है कि मैं मास्टरिंग पर्ल (फोय) पढ़कर पर्ल को स्वयं सीख रहा हूं और वे 2-3 अध्याय दूर हैं :) –

+0

क्लोजर अन्य प्रकार के शब्दावली चर पर भी काम करते हैं, न कि केवल ' my'। – tchrist

+0

@ क्रिसमस: हां, बंद सभी व्याख्यात्मक चर के साथ काम करते हैं। लेकिन जिन चीजों को लोग उनका उपयोग करना चाहते हैं, वे हमारे चर के साथ स्पष्ट रूप से नहीं होते हैं। फिर भी मैंने अपनी प्रतिक्रिया अपडेट की है। – btilly

3

आपको उस सबराउटिन का संदर्भ देना होगा जिसे आप हैश में कॉल करना चाहते हैं।

sub myFunc { 
    print join(' - ', @_); 
} 

my %hash = (key => \&myFunc); 
$hash{key}->(1,2,3); 

साथ \ & myFunc आप समारोह में संदर्भ जो अंक मिलता है:

यहाँ एक उदाहरण है। महत्वपूर्ण() दूर छोड़ना महत्वपूर्ण है। ओहराइज आप फ़ंक्शन के रिटर्न वैल्यू के संदर्भ से गुज़रेंगे।

संदर्भ द्वारा फ़ंक्शन को कॉल करते समय आपको -> ऑपरेटर के साथ इसे खराब करना होगा।

+0

में एक और चीज डालने के लिए धन्यवाद "संदर्भ के अनुसार फ़ंक्शन को कॉल करते समय आपको -> ऑपरेटर के साथ इसे खराब करना होगा।" असत्य। –

+0

@ क्रिस: यह एक बार सच था। अब यह नहीं है। – tchrist

+0

@ क्रिसमस - सच। पर्ल (तीन साल?) सीखने के बाद से यह सच नहीं हुआ है। –

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