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

Joe*_*Fan 4 oop perl module

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

编辑:

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

use MyModule qw/foo bar/;
Run Code Online (Sandbox Code Playgroud)

这将导入MyModulefoobar方法.但我希望能够说:

use MyModule qw/foo doSpecialStuff bar/;
Run Code Online (Sandbox Code Playgroud)

并查找doSpecialStuff来检查我是否需要在程序开头做一些特殊的东西,然后将qw/foo bar /传递给Exporter的导入

Eth*_*her 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);
Run Code Online (Sandbox Code Playgroud)

...然后你会得到一个import()自动为你创建的方法.但是,如果你想import()在普通方法获取参数之前做一些额外的操作,那么就不要导入Exporter import(),并定义你自己的,import()在对你需要的参数列表进行任何修改后调用Exporter :

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);
}
Run Code Online (Sandbox Code Playgroud)

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


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

@symbols = grep {
    my $sym = $_;
    grep { $_ eq $sym } @EXPORT_OK
} @symbols;
Run Code Online (Sandbox Code Playgroud)