2009-11-17 7 views
21

मुझे पूरा यकीन है कि मैंने कहीं कहीं पढ़ा है कि यह संभव है, लेकिन कुछ गठजोड़ हैं जिन्हें आपको अवगत होना चाहिए। दुर्भाग्य से, मुझे ट्यूटोरियल या पेज नहीं मिला है जो वर्णन करता है कि आपको क्या करना है। मैंने Perl tutorials को देखा, और मुझे वह नहीं मिला जो मुझे याद है। क्या कोई मुझे किसी पृष्ठ या दस्तावेज़ पर इंगित कर सकता है जो वर्णन करता है कि एकाधिक पैकेज को एकल .pm फ़ाइल में कैसे रखा जाए?पर्ल में, मैं एक ही .pm फ़ाइल में एकाधिक पैकेज कैसे डालूं?

उत्तर

16

आप बस एक और पैकेज बयान के साथ नए पैकेज से शुरू:

package PackageOne; 

# ...... code 

package PackageTwo; 

# .... more code 

Problems with this approach (archived on 2009)

+0

मुझे लगता है कि मैंने जो लेख पढ़ा है, उसमें कुछ निश्चित चीजें हैं जो आपको करना था या समस्याएं जो स्कॉइंग के साथ दिखाई दे सकती थीं। –

+1

बेशक वहां स्कोपिंग समस्याएं होंगी और यही कारण है कि इसकी अनुशंसा नहीं की गई, मैंने जो लिंक जोड़ा है उसे देखें। – ennuikiller

+4

आप केवल उस नाम के साथ एक पैकेज का उपयोग कर सकते हैं जो फ़ाइल नाम से मेल खाता है, और आप केवल उस फ़ाइल का उपयोग कर सकते हैं जिसमें आसानी से 'उपयोग' हो, जिसमें उसके नाम से संबंधित पैकेज शामिल है। इसके अलावा और तथ्य यह है कि फ़ाइल-स्कोप्ड लेक्सिकल अगले पैकेज में "रिसाव" करेंगे (ब्रेसिज़ जोड़कर टालने योग्य) वहां बहुत कुछ नहीं पता है। – hobbs

4

यह करने के लिए कैसे: बस कई package निर्देश जारी करते हैं।

गॉटचास मैं सोच सकता हूं: my -variables पैकेज-स्थानीय नहीं हैं, इसलिए वे वैसे भी साझा किए जाते हैं। किसी भी मुद्दे को जारी करने से पहले, आप डिफ़ॉल्ट रूप से पैकेज main पैकेज में हैं।

30

इस तरह मैं सामान्य रूप से यह कार्य करें:

use strict; 
use warnings; 
use 5.010; 

{ 
    package A; 
    sub new { my $class = shift; bless \$class => $class } 
    sub hello { say 'hello from A' } 
} 

{ 
    package B; 
    use Data::Dumper; 
    sub new { my $class = shift; bless { @_ } => $class } 
    sub hello { say 'Hello from B + ' . shift->dump  } 
    sub dump { Dumper $_[0] } 
} 

$_->hello for A->new, B->new(foo => 'bar'); 
+0

यदि पैकेज पहले से ही अपने दायरे को परिभाषित करता है तो ब्लॉक स्कोप अच्छा क्या है? – ceving

+1

@ceving - इसी कारण से ~ 5.1' perl 5.14 पर बदल दिया गया था, अब निम्न वाक्यविन्यास की अनुमति दें: 'पैकेज ए {...}'। एनबी। यह '{पैकेज ए के समान है; ...} ')। यह * getchas * से बचें * आप 'my' और' our' जैसी चीज़ों के साथ प्राप्त कर सकते हैं। रेफरी: http://perldoc.perl.org/5.14.0/functions/package.html – draegtun

2

यह वही मेरे लिए काम किया है:

#!/usr/bin/perl 

use strict; 
use warnings; 

{ 
    package A; 
    use Exporter; 
    our @ISA = qw(Exporter); 
    our @EXPORT_OK = qw(a_sub); 
    our @EXPORT = qw(a_sub); 

    sub a_sub { 
     # your code ... 
    } 
} 
{ 
    package B; 
    use Exporter; 
    our @ISA = qw(Exporter); 
    our @EXPORT_OK = qw(b_sub); 
    our @EXPORT = qw(b_sub); 

    sub b_sub { 
     # your code ... 
    } 
} 

# Main code starts here ############## 

use boolean; 
use Data::Dumper; 

import A qw(a_sub); 
import B qw(b_sub); 

a_sub(); 
b_sub(); 

महत्वपूर्ण मुद्दा यह है कि बजाय "उपयोग" का उपयोग करने के लिए, आप इसे "के लिए बदल रहा है आयात करें "(इस तरह यह नहीं जाएगा और फ़ाइल को देखने का प्रयास करें)।

+0

मेरा दृष्टिकोण समान था, मैंने अभी बदल दिया '{पैकेज ए; ...} '' 'पैकेज 'ए {...}'। –

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