2010-10-07 10 views
5

Actualmente estoy desarrollando una secuencia de comandos de perl multi-entorno. Como todos ustedes saben, los malabares de configuración del entorno podrían ser bastante dolorosos si se hacen mal. Como mi script de perl debe permitir que algunos parámetros de línea de comandos en un propósito de sobrecarga valor de configuración, me encontré con la siguiente solución:¿Es posible pasar parámetros a la carga de un módulo 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; 

Por lo tanto, la secuencia de comandos siguiente:

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

produciría la siguiente salida:

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

el punto es que quiero para definir el valor de $ gEnvironment durante la carga del módulo cfg. Esto me permitiría usar el mismo módulo de configuración en todos mis entornos.

¿Esto es posible?

Respuesta

15

creo un método personalizado import es lo que está buscando:

package Cfg; 

our $gMessage; 

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

y en otro lugar:

use Cfg "some message"; 

import es lo Perl llamar cuando use algún módulo. Por favor, consulte perldoc -f use para más detalles.

5

Aquí se explica cómo lograr lo que desea, pero creo que sería mejor si utilizara la ruta completa orientada a objetos. La solución a continuación sólo necesitaría algunas modificaciones para lograr que:

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; 

Y, para 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; 
Cuestiones relacionadas