2010-02-04 20 views
6

मैं यह पता लगाने की कोशिश कर रहा हूं कि एक पर्ल मॉड्यूल के लिए फ़ंक्शन संदर्भ कार्य कैसे करें। मुझे पता है कि इसे मॉड्यूल के बाहर कैसे करना है, लेकिन एक के अंदर? इस तरह कोड पर विचार करें:पर्ल मॉड्यूल में फ़ंक्शन संदर्भ कैसे लिखें?

==mymodule.pm== 
1 sub foo { my $self = shift; ... } 
2 sub bar { my $self = shift; ... } 
3 sub zip { 
4 my $self = shift; 
5 my $ref = \&foo; 
6 $self->&$foo(); # what syntax is appropriate? 
7 } 
==eof=== 

ऊपर लाइनों 5-6 देखें। (1) फ़ंक्शन संदर्भ को पहली जगह में परिभाषित करने के लिए सही वाक्यविन्यास क्या है, और (2) इसे संदर्भित करना?

उत्तर

8

तो $ref एक विधि (पहला तर्क के रूप में $self उम्मीद) है और आप अपने $self पर कॉल करना चाहते हैं, वाक्य रचना है:

$self->$ref(@args) 
+1

इस बुला शैली में नोट करना महत्वपूर्ण बात यह है कि '$ self' है यह निर्धारित करने के लिए उपयोग नहीं किया जाता है कि किस विधि को कॉल करना है (जैसा कि आमतौर पर विधि ओओ-स्टाइल को कॉल करते समय होता है) - विधि पूरी तरह से '$ ref' से निर्धारित होती है, और '$ self' केवल $ ref के पहले तर्क के रूप में पारित होती है। इसके विपरीत अगर '$ ref' एक विधि का नाम था, तो इस मामले में हम उस विधि को' $ self' पर और फिर विरासत के पेड़ पर खोजना शुरू कर देंगे। – Ether

+0

रैंडल "एक-एल" श्वार्टज़ होने के लिए उपरोक्त! वाह! –

+8

@ जोनाथन: चलो समूह [एसएलएल] को लुप्तप्राय समूहों के समूह में नहीं बदलते हैं .. जॉन स्कीट फैनबॉय काफी खराब हैं। :/ – Ether

20

TMTOWTDI

एक समारोह संदर्भ निर्धारित करना:

$ref = \&subroutine; 
$ref = sub { BLOCK }; 
$ref = "subroutineName"; # or $ref = $scalarSubroutineName 

अपसंदर्भन:

$ref->(@args); 
&$ref; 
&{$ref}(@args); 
6

निम्नलिखित का उपयोग करें:

$self->$ref(); 
इस वाक्य के साथ

, $ref विधि का नाम कॉल करने के लिए, जैसे के साथ एक सबरूटीन के लिए एक संदर्भ या यहां तक ​​कि एक तार किया जा सकता है,

my $ref = "foo"; 
$self->$ref(); 

पता है कि दो उत्तराधिकार के संबंध में थोड़ा अलग अर्थ विज्ञान है रहो।

आप स्पष्ट तर्क गुजर नहीं कर रहे हैं, कोष्ठक वैकल्पिक हैं:

$self->$ref; # also flies 
अन्यथा

, का उपयोग

$self->$ref($arg1, \%arg2, @others); 
संबंधित मुद्दे