【问题标题】:Is it possible to pass parameters to a Perl module loading?是否可以将参数传递给 Perl 模块加载?
【发布时间】:2010-10-07 10:11:11
【问题描述】:

我目前正在开发一个多环境 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.

关键是我想在加载 Cfg 模块的过程中定义 $gEnvironment 的值。 这将允许我在所有环境中使用相同的配置模块。

这可能吗?

【问题讨论】:

    标签: perl module


    【解决方案1】:

    我相信自定义 import 方法是您所追求的:

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

    还有其他地方:

    use Cfg "some message";
    

    import 是当您 use 某个模块时 perl 将调用的内容。详情请见perldoc -f use

    【讨论】:

      【解决方案2】:

      这里是如何完成你想要的,但我认为走完整的面向对象路线会更好。下面的解决方案只需要进行一些修改即可实现:

      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;
      

      【讨论】:

        猜你喜欢
        • 2017-07-08
        • 2021-11-11
        • 1970-01-01
        • 2012-10-20
        • 2011-04-22
        • 2017-12-01
        • 1970-01-01
        • 2020-09-14
        • 2012-12-26
        相关资源
        最近更新 更多