2010-10-07 5 views
5

Şu anda bir çok çevre Perl developping ediyorum. Hepinizin bildiği gibi, çevre konfigürasyonu hokkabazlığı kötü bir şekilde yapıldığında oldukça acı verici olabilir. YaniParametreleri Perl modülü yüklemesine geçirmek mümkün mü?

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; 

aşağıdaki komut:

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

sonraki çıkış üretmek misiniz benim perl komut bir yapılandırma değeri aşırı yük amaç bazı komut satırı parametreleri izin vermelidir gibi, ben şu çözümü ile geldi:

Buradaki nokta, Cfg modülünün yüklenmesi sırasında $ gEnvironment değerini tanımlamak istiyorum. Bu Benim bütün ortamlarda aynı yapılandırma modülü kullanmak için izin verecek.

Bu mümkün mü?

cevap

15

Özel bir import yöntem ne konum olduğuna inanıyoruz sonra: Başka bir yerde

package Cfg; 

our $gMessage; 

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

ve:

use Cfg "some message"; 

import perl ne zaman use bazı modül arayacak budur. Detaylar için lütfen perldoc -f use'a bakın. İşte

5

istediğini başarmak nasıl ama daha iyi tam nesne yönelimli rota giderek hizmet olacağını düşünüyorum. Çözelti aşağıda sadece başarmak için bazı değişiklikler gerekir:

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; 

Ve zaman kullanılır?

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