2013-08-13 8 views
7

क्या यह निर्धारित करने का कोई तरीका है कि किसी सबराउटिन को विधि के रूप में बुलाया जाता है (@ISA जांच के साथ) या सादा सबराउटिन के रूप में? शायद किसी प्रकार के एक्सटेंशन मॉड्यूल सुपर -caller() के साथ?पर्ल में, मैं कैसे निर्धारित कर सकता हूं कि एक विधि के रूप में एक subroutine लागू किया गया था?

उदाहरण के लिए,

package Ad::Hoc; 

sub func() { ... } 

दिया कैसे func() निम्न दो आमंत्रण के बीच भेद कर सकते हैं:

Ad::Hoc->func;   # or $obj->func 

Ad::Hoc::func('Ad::Hoc'); # or func($obj) 

(मुझे पता है, यह करने के लिए इच्छा गरीब डिजाइन ™ की एक संभावना संकेत है।)

उत्तर

10

देखें कि Devel::Caller मदद करता है। मैं एक वस्तु पर func आह्वान करने के लिए कोड बदल गया और यह perl 5.14.3 (और 5.24.0) के साथ अपने Mac पर काम करने के लिए लगता है:

called_as_method($level)

called_as_method returns अगर सही है $level पर सबरूटीन बुलाया गया था एक विधि के रूप में।

#!/usr/bin/env perl 

package Ad::Hoc; 
use strict; use warnings; 

use Devel::Caller qw(called_as_method); 

sub func { 
    printf "%s\n", called_as_method(0) ? 'method' : 'function'; 
    return; 
} 

package main; 
use strict; use warnings; 

Ad::Hoc->func; 
Ad::Hoc::func(); 

आउटपुट:

method 
function
+3

लेकिन यदि आप विधि की एक चर संख्या को स्वीकार करते हैं तो आपको केवल इसका उपयोग करने की आवश्यकता है। अन्यथा, आप बस '_ _' के आकार की जांच कर सकते हैं। – ikegami

+0

+1 बहुत ही आशाजनक है। मुझे 'घातक "पुशमार्क या पैड" त्रुटि मिलती है यदि मैं' as_as_method() '(5.18.0, PadWalker-1.96, D :: Caller-2.06) के साथ' $ धन्य-> func' आज़माता हूं, लेकिन "पैकेज विधि" आमंत्रण जैसा कि आप ऊपर बताते हैं, पूरी तरह से काम करता है। – pilcrow

+0

@ikegami, सहमत हुए। यह तकनीकी जिज्ञासा एक समस्या से बाहर हो गई है जिसे शायद पहले स्थान पर अनुमति नहीं दी जानी चाहिए। – pilcrow

-2
package Ad::Hoc; 

sub foo { 
    my $self = shift; 
    if(ref($self) ne 'Ad::Hoc') { 
     unshift @_, $self; 
     undef $self; 
    } 

    if($self) { 
     # I'm a method 
    } else { 
     # I'm a sub 
    } 
} 
+0

कैसे इस भेदभाव विज्ञापन :: Hoc-> समारोह समारोह से समारोह ('विज्ञापन :: Hoc'), या $ O-> समारोह() से ($ ओ)? – pilcrow

+1

@pilcrow, 'ref' विज्ञापन :: होक '' विज्ञापन :: होक 'वापस नहीं लौटाएगा ... – kjprice

+0

@pilcrow, हाँ, क्योंकि आप दूसरे मामले में हैं, मुझे नहीं पता। यदि आप इसे लिख रहे हैं, तो शायद आपको एक अतिरिक्त ध्वज पास करना चाहिए। – kjprice

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

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