Как мне прочитать аргументы, переданные конструктору, и аргументы, переданные `use Module` в Perl? - PullRequest
2 голосов
/ 25 сентября 2010

В настоящее время я делаю новый модуль, и мне было интересно, как я могу реализовать в своем модуле 2 вещи.

Мы часто видим use вроде:

use My::Module qw(something);

например:

use CGI::Carp qw(fatalsToBrowser);
  1. Итак, первый вопрос: как мне получить это, я имею в виду, указал ли пользователь что-либо и что он указал?

  2. Второй вопрос: как передать и прочитать аргументы непосредственно в конструкторе следующим образом:

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

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 ]

6 голосов
/ 25 сентября 2010

perldoc -f use объясняет, что ключевое слово use просто загружает модуль во время компиляции, а затем вызывает ->import для него. Аргументы, выданные вызывающей стороной для оператора use, будут переданы вызову метода import.

Что касается вашего второго вопроса: конструкторы - это просто методы. Получение их аргументов работает так же, как и для любого другого метода или функции, используя @_ переменную .

4 голосов
/ 25 сентября 2010

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 , который сэкономит вам много времени.

...