2010-10-07 30 views
5

मैं वर्तमान में एक बहु-पर्यावरण पर्ल स्क्रिप्ट विकसित कर रहा हूं। जैसा कि आप सभी जानते हैं, बुरी तरह से किए जाने पर पर्यावरण कॉन्फ़िगरेशन जॉगलिंग काफी दर्द हो सकती है।क्या पर्ल मॉड्यूल लोडिंग में पैरामीटर पास करना संभव है?

package Cfg; 
use strict; 
use warnings; 
my $gEnvironment = "DEBUG";#"PRODUCTION"; 
my %gConfig = (
    DEBUG=>{MESSAGE=>"This is a dbg env.",URL=>"www.my-dbg-url.org"}, 
    PRODUCTION=>{MESSAGE=>"This is a prod env.",URL=>"www.shinyprodurl.org"} 
); 
my $gMessage = defined $gConfig{$gEnvironment} ? 
    $gConfig{$gEnvironment}{MESSAGE} : die "Crappy environment"; 
sub Message { $gMessage = shift(@_) if (@_); $gMessage } 
sub Url { 
    defined $gConfig{$gEnvironment} ? 
    $gConfig{$gEnvironment}{URL} : die "Crappy environment" 
} 
1; 

तो, निम्न स्क्रिप्ट:

use strict; 
use warnings; 
use Cfg; 
print Cfg::Message,"\n"; 
Cfg::Message("I'm a surcharged message."); 
print Cfg::Message; 

अगले उत्पादन का उत्पादन होगा जैसा कि मेरे पर्ल स्क्रिप्ट एक विन्यास मूल्य अधिभार उद्देश्य में कुछ आदेश पंक्ति पैरामीटर की अनुमति देनी चाहिए, मैं निम्नलिखित समाधान के साथ आया था:

This is a dbg env. 
I'm a surcharged message. 

बिंदु यह है कि मैं सीएफजी मॉड्यूल के लोडिंग के दौरान $ gEnvironment के मूल्य को परिभाषित करना चाहता हूं। यह मुझे मेरे सभी वातावरण में एक ही कॉन्फ़िगरेशन मॉड्यूल का उपयोग करने की अनुमति देगा।

क्या यह संभव है?

उत्तर

15

मेरा मानना ​​है कि एक कस्टम import विधि आप क्या कर रहे हैं के बाद:

package Cfg; 

our $gMessage; 

sub import { 
    my ($package, $msg) = @_; 
    $gMessage = $msg; 
} 

और कहीं और:

use Cfg "some message"; 

import क्या पर्ल जब आप use कुछ मॉड्यूल फोन होगा। विवरण के लिए कृपया perldoc -f use देखें।

5

यहां आप जो चाहते हैं उसे पूरा करने का तरीका है, लेकिन मुझे लगता है कि आप पूर्ण ऑब्जेक्ट उन्मुख मार्ग पर जाकर बेहतर सेवा करेंगे। समाधान नीचे केवल कुछ संशोधनों की आवश्यकता होगी कि प्राप्त करने के लिए:

package Cfg; 

use strict; use warnings; 
use Carp; 

my $gEnvironment = "DEBUG"; # default 
my $gMessage; 

my %gConfig = (
    DEBUG => { 
     MESSAGE => "This is a dbg env.", 
     URL => "www.my-dbg-url.org", 
    }, 
    PRODUCTION => { 
     MESSAGE => "This is a prod env.", 
     URL => "www.shinyprodurl.org", 
    }, 
); 

sub import { 
    my $pkg = shift; 
    my ($env) = @_; 

    if (defined $env) { 
     unless ($env eq 'PRODUCTION' 
       or $env eq 'DEBUG') { 
      croak "Invalid environment '$env'"; 
     } 
     $gEnvironment = $env; 
    } 
    $gMessage = $gConfig{$gEnvironment}{MESSAGE}; 
    return; 
} 

sub Message { 
    ($gMessage) = @_ if @_; 
    return $gMessage; 
} 

sub Url { 
    return $gConfig{$gEnvironment}{URL}; 
} 


1; 

और, यह उपयोग करने के लिए:

#!/usr/bin/perl 

use strict; use warnings; 

use Cfg qw(PRODUCTION); 

print Cfg::Message,"\n"; 
Cfg::Message("I'm a surcharged message."); 

print Cfg::Message; 
संबंधित मुद्दे

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