2009-04-08 15 views
18

मैं उन्हें एक बार में एक सूची के बिना मेरी नेम स्पेस में सभी बाद के चरणों को बेनकाब करना चाहते हैं:मैं एक पर्ल पैकेज में सभी सबस कैसे निर्यात कर सकता हूं?

@EXPORT = qw(firstsub secondsub third sub etc); 

पूरी तरह से योग्य नाम का उपयोग मौजूदा कोड में परिवर्तन के गुच्छा की आवश्यकता होगी तो मैं नहीं बल्कि ऐसा नहीं चाहते हैं।

क्या @EXPORT_ALL है?

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

जॉन का जवाब देने के लिए क्यों: अभी त्वरित प्रतिक्रिया के लिए मैं अपने स्वयं के पैकेज में सब्स के गुच्छा को मौजूदा स्क्रिप्ट में कम से कम परेशानी और कोड परिवर्तनों के साथ स्थानांतरित करना चाहता हूं (जहां वे सब वर्तमान में उपयोग किए जाते हैं और अक्सर दोहराए जाते हैं)।

इसके अलावा, ज्यादातर, मैं सिर्फ उत्सुक था। (क्योंकि यह लग रहा था कि निर्यातक की तरह भी हो सकता है कि मानक सुविधा है, लेकिन के रूप में कुछ हद तक आश्चर्यजनक रूप से उत्तरों के आधार पर अब तक यह नहीं करता है)

+0

हो सकता है कि अगर तुम क्यों * यदि आप ऐसा करना चाहते हैं तो हमें बताएं सकता है *।लातों के लिए? –

+0

ठीक है, कुछ क्यों जोड़ा। –

उत्तर

23

किसी भी सब पर निर्यात मत करो, और अपने पुस्तकालय में एक पैकेज का नाम घोषित नहीं है। फ़ाइल को require के साथ लोड करें और सबकुछ वर्तमान पैकेज में होगा। बहुत आसान।

+0

उत्कृष्ट जवाब! –

+0

दोह! मैंने इसके बारे में सोचने के बिना उस समाधान के चारों ओर टैप-नाच किया। (लेकिन यह उम्मीद को तोड़ देता है कि एक मॉड्यूल के पास अपना नामस्थान होगा, जो आश्चर्यचकित हो सकता है।) –

+3

मुझे फ़ाइल को "लोड" कैसे करना चाहिए? –

2

तुम हमेशा सबरूटीन्स वहाँ पूरी तरह से निर्दिष्ट के रूप में कॉल कर सकते हैं:

MyModule::firstsub(); 

मॉड्यूल के लिए मैं आंतरिक रूप से लिखता हूं, मुझे लगता है कि यह सम्मेलन काफी अच्छी तरह से काम करता है। यह थोड़ा और टाइपिंग है, लेकिन बेहतर प्रलेखन होता है।

आप जो हासिल करने की कोशिश कर रहे हैं उसके बारे में अधिक जानकारी के लिए perldoc perlmod पर एक नज़र डालें।

अधिक आम तौर पर, आप Exporter के कोड पर देख सकते हैं और देख सकते हैं कि यह ग्लोब एलियासिंग का उपयोग कैसे करता है। या आप अपने मॉड्यूल के नामस्थान की जांच कर सकते हैं और प्रत्येक सबराउटिन निर्यात कर सकते हैं। (मैं कैसे करना है कि इस समय के लिए खोज करने के लिए परवाह नहीं है, लेकिन पर्ल यह काफी आसान बना देता है।) या फिर आप main पैकेज में अपने सबरूटीन्स छड़ी सकता है:

package main; 
sub firstsub() { ... } 

(मुझे नहीं लगता कि यह एक अच्छा विचार है, लेकिन आप जो भी करने की कोशिश कर रहे हैं उससे बेहतर जानते हैं।)

प्रदान करने में कुछ भी गलत नहीं है आप जानते हैं कि आप क्या कर रहे हैं और केवल आपके बारे में सोचने से बचने की कोशिश नहीं कर रहे हैं बाहरी दुनिया के लिए इंटरफ़ेस।

+0

हां, मुझे इसके बारे में पता है, लेकिन प्रत्येक उप के लिए MyModule :: नहीं कहने के बारे में कैसे? मैं सभी निर्यात की तलाश में हूं? –

+0

@ विले एम: अक्सर यह जानना मुश्किल होता है कि अगर कोई यह नहीं कहता है तो किसी और को क्या पता है। ;-) –

+0

जंगल में गिरने वाली ध्वनि और पेड़ के बारे में कुछ दिमाग में आता है ... वैसे भी, आपकी मदद के लिए धन्यवाद –

-1

आपको कुछ टाइपग्लब मुंगिंग करना होगा। मैं यहाँ कुछ इसी तरह का वर्णन:

Is there a way to "use" a single file that in turn uses multiple others in Perl?

आयात दिनचर्या वहाँ वास्तव में आप क्या चाहते हैं क्या करना चाहिए - बस अपने खुद के नाम स्थान में किसी भी प्रतीकों आयात नहीं करते।

3

चेतावनी, कोड निम्नलिखित के रूप में बुरा है निर्यात सब कुछ के रूप में एक विचार:

package Expo; 

use base "Exporter"; 

seek DATA, 0, 0; #move DATA back to package 

#read this file looking for sub names 
our @EXPORT = map { /^sub\s+([^({\s]+)/ ? $1 :() } <DATA>; 

my $sub = sub {}; #make sure anon funcs aren't grabbed 

sub foo($) { 
    print shift, "\n"; 
} 

sub bar ($) { 
    print shift, "\n"; 
} 

sub baz{ 
    print shift,"\n"; 
} 

sub quux { 
    print shift,"\n"; 
} 

1; 

__DATA__ 

यहाँ कुछ कोड मॉड्यूल का उपयोग करता है: यहाँ

#!/usr/bin/perl 

use strict; 
use warnings; 

use Expo; 

print map { "[$_]\n" } @Expo::EXPORT; 

foo("foo"); 
bar("bar"); 
baz("baz"); 
quux("quux"); 

और इसके उत्पादन है:

[foo] 
[bar] 
[baz] 
[quux] 
foo 
bar 
baz 
quux 
+0

बढ़िया, बिल्कुल मैं जो उम्मीद कर रहा था, निर्यातक में कोई मानक तरीका नहीं है, लेकिन यह निश्चित रूप से मुझे जो चाहिए, बहुत धन्यवाद –

+1

मुझे लगता है कि मैं सिर्फ प्रतीक तालिका के माध्यम से चलना होगा और परिभाषित कोड प्रविष्टियों की तलाश करूँगा। रेगेक्स असफल हो सकते हैं कि बहुत से तरीके हैं। –

+0

क्या आप "प्रतीक तालिका के माध्यम से चलने" के बारे में विस्तृत जानकारी दे सकते हैं? –

10

मत करो। लेकिन यदि आप वास्तव में चाहते हैं ... एक कस्टम import लिखें जो प्रतीक तालिका में चलता है और सभी नामित subroutines निर्यात करता है।

# Export all subs in package. Not for use in production code! 
sub import { 
    no strict 'refs'; 

    my $caller = caller; 

    while (my ($name, $symbol) = each %{__PACKAGE__ . '::'}) { 
     next if  $name eq 'BEGIN'; # don't export BEGIN blocks 
     next if  $name eq 'import'; # don't export this sub 
     next unless *{$symbol}{CODE}; # export subs only 

     my $imported = $caller . '::' . $name; 
     *{ $imported } = \*{ $symbol }; 
    } 
} 
+0

http://stackoverflow.com/questions/607282/whats-the-best-way-to-discover- में लियोन का उत्तर भी देखें। all-subroutines-a-perl-module- –

2

शायद आप निर्यात में से एक CPAN पर * मॉड्यूल आप निर्यात के रूप में बाद के चरणों को चिह्नित करने देता है कि बस उप परिभाषा के लिए एक विशेषता जोड़कर में रुचि होगी? (याद है न, जो एक यह था, हालांकि।)

+0

क्या आप इस बारे में सोच रहे थे? http://search.cpan.org/dist/Exporter-NoWork/lib/Exporter/NoWork.pm –

+0

@ चास। ओवेन्स - नहीं, मैं निर्यातक :: सरल के बारे में सोच रहा था – ysth

1

यद्यपि यह आमतौर पर फोन करने वाले नेम स्पेस में मॉड्यूल से सभी sub रों डंप करने के लिए समझदारी नहीं है, यह कभी कभी उपयोगी है (और अधिक सूखी!) स्वचालित रूप से @EXPORT_OK उत्पन्न करने के लिए और %EXPORT_TAGS चर।

सबसे आसान तरीका निर्यातक विस्तार करने के लिए है।

package Exporter::AutoOkay; 
# 
# Automatically add all subroutines from caller package into the 
# @EXPORT_OK array. In the package use like Exporter, f.ex.: 
# 
#  use parent 'Exporter::AutoOkay'; 
# 
use warnings; 
use strict; 
no strict 'refs'; 

require Exporter; 

sub import { 
    my $package = $_[0].'::'; 

    # Get the list of exportable items 
    my @export_ok = (@{$package.'EXPORT_OK'}); 

    # Automatically add all subroutines from package into the list 
    foreach (keys %{$package}) { 
     next unless defined &{$package.$_}; 
     push @export_ok, $_; 
    } 

    # Set variable ready for Exporter 
    @{$package.'EXPORT_OK'} = @export_ok; 

    # Let Exporter do the rest 
    goto &Exporter::import; 
} 

1; 

नोट फोन करने वाले ढेर से हमें निकालता है कि goto के उपयोग: एक साधारण उदाहरण कुछ इस तरह है।

एक और पूरी उदाहरण यहां पाया जा सकता: http://pastebin.com/Z1QWzcpZ यह स्वचालित रूप से सबरूटीन उपसर्गों से टैग समूहों उत्पन्न करता है।

1

मामला 1

लाइब्रेरी है:

package mycommon; 

use strict; 
use warnings; 

sub onefunctionthatyoumadeonlibary() { 
} 
1; 

आप इसे उपयोग कर सकते हैं आम बुला :::

#!/usr/bin/perl 
use strict; 
use warnings; 
use mycommon; 

common::onefunctionthatyoumadeonlibary() 

मामला 2

लाइब्रेरी है, yousimple उन्हें निर्यात:

package mycommon; 

use strict; 
use warnings; 

use base 'Exporter'; 

our @EXPORT = qw(onefunctionthatyoumadeonlibary); 
sub onefunctionthatyoumadeonlibary() { 
} 
1; 

एक ही "नाम स्थान" में यह उपयोग:

#!/usr/bin/perl 
use strict; 
use warnings; 
use mycommon qw(onefunctionthatyoumadeonlibary); 

onefunctionthatyoumadeonlibary() 

इसके अलावा हम इस दो मामलों का मिश्रण कर सकते हैं, हम संकुल नाम और अन्य कार्यों बुला बिना अधिक आम कार्यों के लिए इसका इस्तेमाल करने के लिए निर्यात कर सकते हैं कि हम केवल इसे पैकेज नाम से कॉल करें और उनको निर्यात करने की आवश्यकता नहीं है।

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