我如何读取传递给构造函数的args和由Perl中的`use Module`传递的args?

时间:2010-09-25 11:42:32

标签: perl perl-module

目前我正在制作一个新模块,我想知道如何在我的模块中实现2件事。

我们经常看到use喜欢:

use My::Module qw(something);

例如:

use CGI::Carp qw(fatalsToBrowser);
  1. 所以第一个问题是,我该怎么做 检索这个,我的意思是 用户指定了什么以及什么 他指定了吗?

  2. 第二个问题是,我如何通过并阅读args 直接在构造函数上 这样:

    my $ my_module = My :: Module-> new(arg1,arg2,arg3);

  3. AS要求评论简单模块测试代码:

    package My::Module;
    
    # $Id$
    
    use strict;
    use Carp;
    
    sub new {
            my $class = shift;
            my $self  = {};
    
            $self->{ARG1}         = undef;
            $self->{ARG2}         = undef;
            $self->{ARG3}         = undef;
            $self->{ARG4}         = undef;
    
            bless($self,$class);
            return $self;
    }
    
    sub arg1 {
            my $self = shift;
            if (@_) { $self->{ARG1} = shift }
            return $self->{ARG1};
    }
    
    sub arg2 {
            my $self = shift;
            if (@_) { $self->{ARG2} = shift }
            return $self->{ARG2};
    }
    
    sub arg3 {
            my $self = shift;
            if (@_) { $self->{ARG3} = shift }
            return $self->{ARG3};
    }
    
    sub arg4 {
            my $self = shift;
            if (@_) { $self->{ARG4} = shift }
            return $self->{ARG4};
    }
    
    sub dump {
            my $self = shift;
    
            require Data::Dumper;
            my $d = Data::Dumper->new([$self], [ref $self]);
            $d->Deepcopy(1);
            return $d->Dump();
    }
    
    1;  # so the require or use succeeds
    

2 个答案:

答案 0 :(得分:6)

perldoc -f use解释说use keyword只是在编译时加载一个模块,然后在其上调用->import。调用者给use语句的参数将传递给import方法调用。

至于你的第二个问题:构造函数只是方法。使用@_ variable获取他们的参数就像使用任何其他方法或函数一样。

答案 1 :(得分:4)

import子例程获取use中传递的参数。以下代码示例可以为您提供帮助。

文件:My / Module.pm

package My::Module;

use warnings;
use strict;

use Data::Dumper;

sub import {
    my ( $package, @args ) = @_;

    print Dumper \@args;
}

1;

文件:module.pl

#!/usr/bin/env perl

use warnings;
use strict;

use My::Module qw(something);

如果您正在编写面向对象的模块,可以尝试使用Moose,这将为您节省大量时间。