我目前正在开发一个多环境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;
Run Code Online (Sandbox Code Playgroud)
那么,以下脚本:
use strict;
use warnings;
use Cfg;
print Cfg::Message,"\n";
Cfg::Message("I'm a surcharged message.");
print Cfg::Message;
Run Code Online (Sandbox Code Playgroud)
会产生下一个输出:
This is a dbg env.
I'm a surcharged message.
Run Code Online (Sandbox Code Playgroud)
关键是我想在加载Cfg模块期间定义$ gEnvironment的值.这将允许我在所有环境中使用相同的配置模块.
这可能吗 ?
raf*_*afl 16
我相信import你所追求的是一种自定义方法:
package Cfg;
our $gMessage;
sub import {
my ($package, $msg) = @_;
$gMessage = $msg;
}
Run Code Online (Sandbox Code Playgroud)
和其他地方:
use Cfg "some message";
Run Code Online (Sandbox Code Playgroud)
import是你在use某个模块时会调用的perl .请参阅perldoc -f use详细信息.
这是如何实现你想要的,但我认为通过完整的面向对象的路线你会得到更好的服务.下面的解决方案只需要进行一些修改即可实现:
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;
Run Code Online (Sandbox Code Playgroud)
并且,使用它:
#!/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;
Run Code Online (Sandbox Code Playgroud)