2010-08-16 15 views
5

का उपयोग कर सभी कार्यों के लिए ओप कैसे डंप करें अभी डंप प्राप्त करने के लिए मैं subroutine printargs का नाम दे सकता हूं।बी :: कंसिस

perl -MO=Concise,printargs,-main,-terse Hello.pl 

मान लिया जाये कि मैं कई सबरूटीन्स है, मैं कैसे सब सबरूटीन्स के लिए विवरण डंप करने के लिए एक सामान्य मॉड्यूल का निर्माण कर सकते हैं?

+0

यह "संक्षिप्त", एक पूंजी 'सी' के साथ वर्तनी रूप में अच्छी तरह से महत्वपूर्ण है (मैं अब देखते हैं - धन्यवाद) – Roboprog

उत्तर

4

एक भी सबरूटीन डंप करने के लिए आप

B::Concise::compile($sub)->() 

उपयोग कर सकते हैं जहां $ उप एक उप के संदर्भ में है।

यदि आप अग्रिम में subs की सूची जानते हैं, तो आप कर चुके हैं, बस उनमें से प्रत्येक के लिए उपरोक्त करें।

no strict 'refs'; 
for my $k (keys %{"$pkgname\::"}) { 
    if (*{${"$pkgname\::"}{$k}}{CODE}) { 
     print "$k\n"; # sub name 
    } 
} 

अपडेट::

अन्यथा, एक विशिष्ट पैकेज में मौजूदा सबरूटीन नाम की सूची प्राप्त करने, आप हमेशा कि पैकेज के लिए प्रतीक तालिका चल सकता है मेरी पहली लाइन एक गलती निहित है, जो निश्चित अब तय करें। और यहाँ पूर्ण उदाहरण स्क्रिप्ट है:

package Blah; 

sub x { return "x"; } 
sub hehe { print 2*2, "\n"; } 
sub meme { die "ouch" } 

our $varvar; # to illustrate the {CODE} thingy 

package main; 
use warnings; 
use strict; 
use B::Concise; 

my $pkgname = "Blah"; 
no strict 'refs'; 
for my $k (keys %{"$pkgname\::"}) { 
    if (*{${"$pkgname\::"}{$k}}{CODE}) { 
     my $sub = \&{${"$pkgname\::"}{$k}}; 
     print "Dump of $pkgname\::$k():\n"; 
     B::Concise::compile($sub)->(); 
    } 
} 
+1

आप स्क्रिप्ट के लिए एक पूर्ण काम कर उदाहरण प्रदान कर सके आप दिया? क्षमा करें, यहाँ perl नौसिखिया। [मान लीजिए मेरे पास एक फाइल हैलो.पीएल, मुझे क्या करना चाहिए]? –

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