检查参数“使用”,并传递其余的?

时间:2010-03-08 21:13:16

标签: perl module oop

我有一个Perl模块,我希望能够选择我的模块用户在“use”调用中传递的参数。无论哪个我都不认识,我想传递。我尝试通过覆盖“导入”方法来做到这一点,但我没有太多运气。

修改

为了澄清,我可以像这样使用我的模块:

use MyModule qw/foo bar/;

将导入 MyModule foo bar 方法。但我希望能够说:

use MyModule qw/foo doSpecialStuff bar/;

并查找 doSpecialStuff 以检查我是否需要在程序开头执行一些特殊操作,然后将qw / foo bar /传递给Exporter的 import < / p>

3 个答案:

答案 0 :(得分:8)

通常,你会这样做来获得Exporter的import()功能(这不是唯一的方法,但它是一种常用的方法):

package MyClass;
use strict;
use warnings;
use Exporter 'import';  # gives you Exporter's import() method directly
our @EXPORT_OK = qw(stuff more_stuff even_more_stuff);

...然后您将自动为您创建import()方法。但是,如果您想在普通方法获取参数之前在import()中执行额外操作,则不要导入导出器的import(),并定义您自己的,调用导出器的{{1}在对您需要的参数列表进行任何更改后:

import()

然而,我想知道为什么你需要这样做...当传递一个无法识别的符号时死亡的标准行为通常是一件好事。你为什么要忽略无法识别的符号? (编辑:我现在看到,你想在导入符号的基础上指定其他行为,这在Perl中并不罕见。所以定义你自己的import()方法绝对是这里的方法,到抓住那些价值观。)


<子> PS。如果你只想导入由@EXPORT_OK定义的符号,它可以这样实现:

package MyClass;
use strict;
use warnings;
use parent 'Exporter';

sub import
{
    my ($class, @symbols) = @_;

    # do something with @symbols, as appropriate for your application
    # ...code here left as an exercise for the reader :)

    # now call Exporter's import, and import to the right level
    local $Exporter::ExportLevel = 1;
    $class->SUPER::import(@symbols);
}

答案 1 :(得分:3)

Exporter的典型用法是声明您的模块继承自Exporter,并在使用模块时隐式调用Exporter的{​​{1}}方法。但这可以防止您为模块创建自己的import方法。

解决方法是使用Exporter的export_to_level方法,该方法执行import的函数,而无需显式执行Exporter方法。以下是使用它的典型方法:

Exporter::import

答案 2 :(得分:2)

我在模块中这样做了:

sub import {
    return if not @_;
    require Exporter;
    my $pkg = shift;

    # process @_ however you want

    unshift @_, $pkg;
    goto &Exporter::import;
}

如果你想要无需插入等,你也可以从Exporter继承。