2010-09-10 16 views
17

मेरे पास एक कोड है जो फ़ंक्शन को कॉल करता है। लेकिन मुझे यह फ़ंक्शन मॉड्यूल नहीं जानता है। मुझे इस फ़ंक्शन को संशोधित करने की आवश्यकता है।पर्ल में, मैं कैसे देख सकता हूं कि कौन सा मॉड्यूल दिया गया फ़ंक्शन आयात किया गया था?

मैं इसे कैसे देख सकता हूं?

+3

क्या समस्या आप यह जानने के द्वारा हल करने के लिए प्रयास कर रहे हैं? ऐसा होने से पहले इसे ठीक करने का एक तरीका हो सकता है। :) –

+0

रुबी में अन्य वर्गों के कार्यों को संशोधित करना आम हो सकता है, लेकिन पर्ल में एक काला कला है जिसे * अत्यंत * दुर्लभ परिस्थितियों के लिए आरक्षित किया जाना चाहिए। आपको ऐसा करने की ज़रूरत क्यों है? – Ether

+2

@ 'ब्रायन डी फोय' तीन साल बाद मैं यह पुष्टि करने के लिए एक यूनिट टेस्ट लिखने की कोशिश कर रहा हूं कि मुझे एक शर्त के तहत एक फ़ंक्शन का शुद्ध-पर्ल संस्करण या अन्य किसी अन्य स्थिति के तहत एक एक्सएस संस्करण मिल जाए, और अचानक मेरे पास मुझे लगता है कि इस ओपी के quesiton के लिए एक वैध उपयोग-मामला है। ;) – DavidO

उत्तर

3

समारोह स्वचालित रूप से Exporter का उपयोग कर एक और मॉड्यूल से आयात किया गया था, तो यह इस मॉड्यूल के @EXPORT वैश्विक चर में पाया जा सकता:

perl -MEncode -e 'print join "\n", @Encode::EXPORT' 
decode 
decode_utf8 
... 

आप use के कार्यों की एक सूची प्रदान कर सकते हैं। इस तरह आप हमेशा पता चल जाएगा जो पैकेज एक समारोह अंतर्गत आता है:

use Encode  qw[ encode ]; # encode() imported from the Encode module 
use Data::Dumper qw[];   # no functions imported from Data::Dumper 
28

Devel::Peek मॉड्यूल बहुत चर के बारे में जानकारी के सभी प्रकार प्राप्त करने के लिए उपयोगी है।

$ perl -MDevel::Peek -MList::Util=first -e'Dump(\&first)' 
SV = IV(0x1094e20) at 0x1094e28 
    REFCNT = 1 
    FLAGS = (TEMP,ROK) 
    RV = 0x11183b0 
    SV = PVCV(0x10ff1f0) at 0x11183b0 
    REFCNT = 3 
    FLAGS = (POK,pPOK) 
    PROTOTYPE = "&@" 
    COMP_STASH = 0x0 
    XSUB = 0x7f7ecbdc61b0 
    XSUBANY = 0 
    GVGV::GV = 0x11183c8  "List::Util" :: "first" 
    FILE = "ListUtil.c" 
    DEPTH = 0 
    FLAGS = 0x800 
    OUTSIDE_SEQ = 0 
    PADLIST = 0x0 
    OUTSIDE = 0x0 (null) 

GVGV::GV भाग में वहाँ महत्वपूर्ण बिट है: चीजें आप इसके साथ क्या कर सकते हैं में से एक एक सबरूटीन के लिए एक संदर्भ डंप और ग्लोब यह से आया के नाम मिलता है।

एक वैकल्पिक समाधान Sub::Identify होगा, जो वास्तव में केवल आपको कोड संदर्भों के लिए नाम देता है। हालांकि, Devel::Peek के बारे में जानना भी कई अन्य स्थितियों में आसान है, इसलिए मैंने पहले इसका उल्लेख किया।

+4

यह मेरे द्वारा किए गए कार्यों की तुलना में काफी बेहतर है। कोड को संकलित करने में विफल होने तक प्रत्येक मॉड्यूल का उपयोग होने के बाद मैं '()' में जोड़ा होता। –

8

पर्ल का डीबगर आपके इच्छित तरीके से खोद सकता है। उदाहरण के लिए:

main::(-e:1): 0 
    DB<1> sub foo {} 

    DB<2> x \&foo 
0 CODE(0xca6898) 
    -> &main::foo in (eval 5)[/usr/share/perl/5.10/perl5db.pl:638]:2-2

यह इस Devel::Peek का उपयोग करता है:

Foo::bar

ध्यान दें कि उपरोक्त उदाहरण देता है:

=head2 C<CvGV_name_or_bust> I<coderef> 

Calls L<Devel::Peek> to try to find the glob the ref lives in; returns 
C<undef> if L<Devel::Peek> can't be loaded, or if C<Devel::Peek::CvGV> can't 
find a glob for this ref. 

Returns C<< I<package>::I<glob name> >> if the code ref is found in a glob. 

=cut 

sub CvGV_name_or_bust { 
    my $in = shift; 
    return unless ref $in; 
    $in = \&$in;   # Hard reference... 
    eval { require Devel::Peek; 1 } or return; 
    my $gv = Devel::Peek::CvGV($in) or return; 
    *$gv{PACKAGE} . '::' . *$gv{NAME}; 
} ## end sub CvGV_name_or_bust 

आप इसके साथ

#! /usr/bin/perl 

use warnings; 
use strict; 

package Foo; 

sub bar {} 

package main; 

BEGIN { *baz = \&Foo::bar } 

sub CvGV_name_or_bust { ... } 

print CvGV_name_or_bust(\&baz), "\n"; 

आउटपुट व्यायाम हो सकता है Foo:bar एक अलग नाम है, लेकिन आप दोनों पैकेज प्राप्त करते हैं जहां उपनाम उप रहते हैं और इसका नाम भी है।

1

आप किसी भी सबरूटीन संदर्भ Sub::Identify::sub_fullname को पारित कर सकते हैं और यह आपको मॉड्यूल जहां इस उप परिभाषित किया गया था दिखाएगा:

use Sub::Identify qw/sub_fullname/; 
sub foo { 
    print sub_fullname(\&foo); # main::foo 
    print sub_fullname(sub{}); # main::__ANON__ 
} 

foo(); 

के लिए विवरण Sub::Identify

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

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