2009-02-08 19 views
5

मैं कई मॉड्यूल के साथ पर्ल में एक ऐप लिख रहा हूं। मैं, कुछ वैश्विक स्थिरांक कि हर जगह से दिखाई जाएगी लिखने के लिए इस तरह हैं:मैं पर्ल में एकाधिक मॉड्यूल में स्थिरांक कैसे आयात कर सकता हूं?

#Constants.pm 
$h0 = 0; 
$scale = 20; 

और फिर कई मॉड्यूल में main:: या Constants:: साथ योग्यता के बिना उन्हें इस्तेमाल करते हैं। हालांकि, अगर मैं एक से अधिक मॉड्यूल में use Constants; लिखता हूं, तो वे केवल एक नामस्थान में आयात किए जाते हैं। क्या इसके आसपास कोई रास्ता है?

मैं नवीनतम ActivePerl का उपयोग कर रहा हूं।

उत्तर

2

आप Constants.pm के शीर्ष पर इस डाल सकते हैं:

package main; 

इस मामले में सभी चर आप main नाम स्थान में हो जाएगा निर्धारित करें:

$main::x 

या आप बहादुर महसूस कर रहे हैं, तो :

package; 

इस मामले में सभी चर आप डब्ल्यू परिभाषित बीमार एक खाली नाम स्थान में हो:

$::x 

ध्यान दें कि कोई नाम स्थान के साथ package का उपयोग कर हतोत्साहित किया जाता है, और जाहिरा तौर पर पर्ल के कुछ संस्करणों में बहिष्कार किया जाएगा। नीचे उद्धरण देखें।


man perlfunc से हवाला देते हुए:

 

     package NAMESPACE 
     package Declares the compilation unit as being in the given 
       namespace. The scope of the package declaration is 
       from the declaration itself through the end of the 
       enclosing block, file, or eval (the same as the "my" 
       operator). All further unqualified dynamic identifiers 
       will be in this namespace. A package statement affects 
       only dynamic variables--including those you've used 
       "local" on--but not lexical variables, which are cre? 
       ated with "my". Typically it would be the first decla? 
       ration in a file to be included by the "require" or 
       "use" operator. You can switch into a package in more 
       than one place; it merely influences which symbol table 
       is used by the compiler for the rest of that block. 
       You can refer to variables and filehandles in other 
       packages by prefixing the identifier with the package 
       name and a double colon: $Package::Variable. If the 
       package name is null, the "main" package as assumed. 
       That is, $::sail is equivalent to $main::sail (as well 
       as to $main'sail, still seen in older code). 

       If NAMESPACE is omitted, then there is no current pack? 
       age, and all identifiers must be fully qualified or 
       lexicals. However, you are strongly advised not to 
       make use of this feature. Its use can cause unexpected 
       behaviour, even crashing some versions of Perl. It is 
       deprecated, and will be removed from a future release. 


संपादित करें: इस सवाल के साथ-साथ उपयोगी हो सकता है: How do I use constants from a Perl module?

+0

धन्यवाद। मुझे वास्तव में क्या चाहिए "मुख्य" को छोड़ने का टुकड़ा। – Lev

+0

अगर मैं वास्तव में काम करता हूं तो मैं उत्सुक हूं। यदि ऐसा होता है, तो मैं उत्तर के शीर्ष पर अस्वीकरण हटा दूंगा। –

+1

यह स्थिरांक को मुख्य :: में रखता है, लेकिन अब आपको सभी स्थिरांक को मुख्य :: –

5

किसी को भी यह न बताएं कि मैंने आपको यह बताया है, लेकिन पर्ल के विशेष चर हर जगह उपलब्ध हैं। आप शायद देखा है कि इस काम नहीं करता है:

{ package Foo; 
our $global = 42; } 

{ package Bar; 
say "global is $global"; } 

क्योंकि $global वास्तव में $Foo::global कहा जाता है यही कारण है कि। आप भी शायद देखा है कि इस "नियम" @INC, %ENV, $_, आदि जैसी चीजों पर लागू नहीं होता है कि वे चर हमेशा से रहे हैं main में माना जाता है।

लेकिन वास्तव में, यह केवल उन चर से अधिक है। संपूर्ण ग्लोब main में "मजबूर" हो जाता है। इसका मतलब है कि आप कुछ इस तरह लिख सकते हैं:

{ package Constants; 
    $_{PI} = 3.141592; } 

{ package Foo; 
    say "pi is $_{PI}"; } 

और यह काम करेंगे।

(यही बात लागू होगी $ENV, &INC, आदि के लिए)

क्या तुमने कभी वास्तविक कोड में ऐसा करते हैं, तथापि, कोई आपको हत्या की उम्मीद :) यह जानना है, हालांकि अच्छा है, सिर्फ मामले में आप किसी और को देख रहे हैं।

2

आप Exporter इस तरह उपयोग कर सकते हैं:

Constants.pm में:

 
#Constants.pm 
require Exporter; 
@ISA = qw(Exporter); 
@EXPORT = qw($h0 $scale); 
@EXPORT_OK = qw(myfunc); 

$h0 = 0; 
$scale = 20; 
sub myfunc {...} 

नोट्स:
* &myfunc में &@EXPORT सरणी में वैकल्पिक है, और यह तुम नहीं अनुशंसा की जाती है इसका इस्तेमाल करें। * इस $h0 और $scale डिफ़ॉल्ट रूप से, और & myfunc ही अगर यह स्पष्ट रूप से अनुरोध किया है निर्यात करेगा

(कैसे निर्दिष्ट करने के लिए जो प्रतीकों ग्राहक मॉड्यूल द्वारा आयात किए जाते हैं नीचे देखें) और फिर मॉड्यूल Constants.pm आयात करता है और चाहता है में $h0, $scale या &myfunc का उपयोग करने के लिए आप सभी आयात करने के लिए निम्नलिखित को जोड़ते हैं जो @EXPORT में Constants.pm में हैं।

 
#MyModule.pm 
use Constants qw(; 

आप केवल प्रतीकों में से कुछ आयात करना चाहते हैं का उपयोग करें:

 
#MyModule.pm 
use Constants qw($h0); 

और अंत में, यदि आप Constant.pm`s प्रतीकों में से किसी भी आयात करने के लिए नहीं करना चाहते हैं का उपयोग करें:

 
#MyModule.pm 
use Constants(); 
7

कोड का यह हिस्सा बिल्कुल वही करना चाहिए जो आप चाहते हैं। सभी कुडोस को lkundrak पर भेजें।

package Constants; 

use base qw/Exporter/; 

use constant BOB => 666; 
use constant ALICE => 555; 

sub import { 
    no strict "refs"; 

    ${[caller]->[0].'::'}{$_} = ${__PACKAGE__."::"}{$_} 
     foreach grep { not /^(ISA|isa|BEGIN|import|Dumper)$/ } 
      keys %{__PACKAGE__."::"}; 
} 
+0

यह मजाकिया है कि यह एकमात्र उत्तर है जो स्थिरांक से संबंधित है (और यहां तक ​​कि सवाल वास्तव में उन्हें स्पर्श नहीं करता है)। – Cornelius

+0

यह उत्तर दिया जाना चाहिए था। पूरी तरह से काम किया, धन्यवाद! – Ishikawa91

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

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