2010-10-07 16 views
5

Attualmente sto sviluppando uno script perl multi-environment. Come tutti sapete, la giocoleria per la configurazione dell'ambiente potrebbe essere un bel problema se mal fatta. Come il mio script perl deve consentire alcuni parametri della riga di comando in uno scopo sovraccarico di valore di configurazione, sono venuto con la seguente soluzione:È possibile caricare i parametri in un modulo Perl caricando?

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; 

Così, il seguente script:

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

produrrebbe l'output successivo:

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

Il punto è definire il valore di $ gEnvironment durante il caricamento del modulo Cfg. Questo mi permetterebbe di usare lo stesso modulo di configurazione in tutti i miei ambienti.

È possibile?

risposta

15

Credo che un metodo personalizzato import è quello che stai dopo:

package Cfg; 

our $gMessage; 

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

e da qualche altra parte:

use Cfg "some message"; 

import è ciò che Perl chiamare quando si use qualche modulo. Si prega di vedere perldoc -f use per i dettagli.

5

Ecco come ottenere ciò che si desidera, ma penso che sarebbe meglio servirsi del percorso completo orientato agli oggetti. La soluzione qui di seguito avrebbe solo bisogno di alcune modifiche per raggiungere questo:

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; 

E, per usarlo:

#!/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; 
Problemi correlati