2011-09-14 16 views
19

कोई पर्ल कोड संदर्भ का सबराउटिन नाम कैसे निर्धारित करेगा? मैं नामित और अज्ञात subroutines के बीच अंतर करना भी पसंद करूंगा।पर्ल कोड संदर्भ के सबराउटिन नाम को निर्धारित करना

this question के लिए धन्यवाद मुझे पता है कि कोड कैसे प्रिंट करें, लेकिन मुझे अभी भी पता नहीं है कि नाम कैसे प्राप्त करें।

उदाहरण के लिए, मैं निम्नलिखित से 'inigo_montoya' प्राप्त करना चाहते हैं:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Data::Dumper; 
$Data::Dumper::Deparse = 1; 

my $sub_ref = \&inigo_montoya; 

print Dumper $sub_ref; 



# === subroutines === 

sub inigo_montoya { 
    print <<end_quote; 
I will go up to the six-fingered man and say, "Hello. My name is Inigo 
Montoya. You killed my father. Prepare to die."'; 
end_quote 
} 
+4

बंद करो कि कह! –

उत्तर

21

क्यों नहीं पूछते हैं, संकलक क्या देखता है? (यह अज्ञात सब पर वापस करेगा)।

#!/usr/bin/perl 

use strict; 
use warnings; 

my $sub_ref = \&inigo_montoya; 


use B qw(svref_2object); 
my $cv = svref_2object ($sub_ref); 
my $gv = $cv->GV; 
print "name: " . $gv->NAME . "\n"; 


sub inigo_montoya { 
    print "...\n"; 
} 
+0

बहुत अच्छा; यह बहुत अच्छा काम करता प्रतीत होता है! धन्यवाद! – vlee

+0

इनिगो मोंटोया (हे!) के संदर्भ में प्यार –

+1

बी संकलक नहीं है, यह आत्मनिरीक्षक है। – rurban

4

मैं बाहर से समारोह के नाम पर बुला के बारे में यकीन नहीं है, लेकिन आप के भीतर से प्राप्त कर सकते हैं caller समारोह के माध्यम से सबरूटीन:

sub Foo {print "foo!\n";return (caller(0))[3];} 
$function_name=Foo(); 
print "Called $function_name\n"; 

यह है निम्नलिखित उत्पादन:

foo! 
Called main::Foo 

बेशक, आप फ़ंक्शन नाम को उन आइटम्स में से एक के रूप में वापस कर सकते हैं जो सबराउटिन लौटाते हैं। इस तरह, आप इसे कैप्चर कर सकते हैं और इसे प्रदर्शित करने का विकल्प (या अन्य तर्क, आदि में इसका उपयोग कर सकते हैं)।

+0

दुर्भाग्य से कई सारे subroutines हैं। मुझे लगता है कि मैं उन सभी को अपने कार्यक्षेत्र में संशोधित कर सकता हूं। – vlee

6

जनवरी Hartung के विचार पर विस्तार (और अपने ही खत्म), तो आप पूरी तरह से योग्य नाम और कोई बात नहीं के लिए कुछ जानकारी का पता लगाने कि यह क्या है हो सकता है या वह कहाँ से आया:

use B qw(svref_2object); 

sub sub_name { 
    return unless ref(my $r = shift); 
    return unless my $cv = svref_2object($r); 
    return unless $cv->isa('B::CV') 
       and my $gv = $cv->GV 
       ; 
    my $name = ''; 
    if (my $st = $gv->STASH) { 
     $name = $st->NAME . '::'; 
    } 
    my $n = $gv->NAME; 
    if ($n) { 
     $name .= $n; 
     if ($n eq '__ANON__') { 
      $name .= ' defined at ' . $gv->FILE . ':' . $gv->LINE; 
     } 
    } 
    return $name; 
} 
+2

क्या 'STASH' चेक आवश्यक है? [AFAICT] (http://en.wiktionary.org/wiki/AFAICT) यहां तक ​​कि अज्ञात subroutines भी एक पैकेज है। –

8

Sub::Identify वास्तव में यह करता है, तो आप से है कि सभी बुरा B::svref_2object() सामान छुपा ताकि आप इसके बारे में सोचने के लिए नहीं है।

#!/usr/bin/env perl 

use strict; 
use warnings; 
use feature 'say'; 

use Sub::Identify ':all'; 

my $sub_ref = \&inigo_montoya; 

say "Sub Name: ", sub_name($sub_ref); 
say "Stash Name: ", stash_name($sub_ref); 
say "Full Name: ", sub_fullname($sub_ref); 

# === subroutines === 

sub inigo_montoya { 
    print <<' end_quote'; 
I will go up to the six-fingered man and say, "Hello. My name is Inigo 
Montoya. You killed my father. Prepare to die."'; 
    end_quote 
} 

आउटपुट कौन सा:

$ ./sub_identify.pl 
Sub Name: inigo_montoya 
Stash Name: main 
Full Name: main::inigo_montoya 
संबंधित मुद्दे