2010-10-07 377 views
5

我目前正在開發一個多環境的perl腳本。衆所周知,如果做得不好,環境配置的雜耍可能會非常痛苦。由於我的perl腳本必須允許在配置值過載用途的一些命令行參數,我想出了以下解決方案:是否可以將參數傳遞給Perl模塊加載?

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. 

問題是我想在加載Cfg模塊期間定義$ gEnvironment的值。 這將允許我在我的所有環境中使用相同的配置模塊。

這可能嗎?

回答

15

我相信一個自定義的import方法是你追求的:

package Cfg; 

our $gMessage; 

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

和別的地方:

use Cfg "some message"; 

import是什麼perl的會打電話給你時,一些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; 
相關問題