Можно ли передать параметры загрузке модуля Perl? - PullRequest
6 голосов
/ 07 октября 2010

В настоящее время я разрабатываю 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.

Дело в том, что я хочу определить значение $ gEnvironment во время загрузки модуля Cfg.Это позволило бы мне использовать один и тот же модуль конфигурации во всех моих средах.

Возможно ли это?

Ответы [ 2 ]

16 голосов
/ 07 октября 2010

Я считаю, что вам нужен пользовательский import метод:

package Cfg;

our $gMessage;

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

и где-то еще:

use Cfg "some message";

import - это то, что perl будет вызывать, когда вы use используете какой-либо модуль. Подробнее см. perldoc -f use.

5 голосов
/ 07 октября 2010

Вот как можно выполнить то, что вы хотите, но я думаю, что вам будет лучше, если вы пройдете полный объектно-ориентированный маршрут.Для решения, приведенного ниже, потребуется всего несколько модификаций:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...