在这些Perl使用行中发生了什么?

在这些Perl使用行中发生了什么?,perl,perl-module,Perl,Perl Module,我不明白这里发生了什么: use PAR { file => 'foo.par', fallback => 1 }; 我认为这是一个匿名散列。模块如何从use行使用它?你能解释一下吗 编辑:我对PAR模块不感兴趣。我只是对幕后的工作方式感兴趣。我如何才能像那样配置我的模块?PAR是CPAN模块。HASHRF是配置参数传递到PAR。 守则: use PAR { file => 'foo.par, fallback => 1 }; use Foo::Bar; 表示如果可用

我不明白这里发生了什么:

use PAR { file => 'foo.par', fallback => 1 };
我认为这是一个匿名散列。模块如何从
use
行使用它?你能解释一下吗

编辑:我对PAR模块不感兴趣。我只是对幕后的工作方式感兴趣。我如何才能像那样配置我的模块?

PAR是CPAN模块。HASHRF是配置参数传递到PAR。 守则:

use PAR { file => 'foo.par, fallback => 1 };
use Foo::Bar;

表示如果可用,则使用
Foo::Bar
,但如果不可用,则返回到使用存档“
Foo.par
”(该存档可能包含
Foo::Bar的存档版本)。

更基本地说,这就是有趣的hashref语法所做的(用作参考):

假设我们有这个基本模块(将它放在当前目录中的
Foo.pm
):

当我们调用
perl-I.-wle'usefoo{a=>1,b=>2}
时,执行代码
Foo->import({a=>1,b=>2})
。这就是我们得到的输出:

import was passed these arguments: $VAR1 = [
          'Foo',
          {
            'a' => 1,
            'b' => 2
          }
        ];

基本上,这种语法让我们可以使用,但事实上,您可以让
import()
做任何您喜欢的事情(只需确保大量记录,以免引起混淆!)

当您
使用一个模块时,您可以向它传递一个参数列表。在您的示例中(似乎有输入错误,缺少结束引号),传递了一个包含一个元素(散列引用)的列表

更一般地说:

use Module LIST
变成这样:

BEGIN {
    require Module;
    Module->import( LIST );
}
BEGIN
块确保所有内容都在编译时发生。
require
将模块加载到内存中(如果它还没有)。然后使用原始
use
语句中传递的任何参数(如
LIST
)调用模块的
import()
方法

为了让您自己的模块使用这样的
参数列表
,您的模块需要定义一个
import()
方法。许多模块不这样做;相反,它们从导出器类继承
import()
。有关更多详细信息,请参阅

如果您的模块定义了自己的
import()
方法,则您需要自己将符号导出到客户机代码中,或者更常见的是,使用
Exporter
提供的
export\u-to\u-level()
方法。此方法的第一个参数是一个正整数,指定要将符号导出到的调用堆栈中的级别。最常见的值1表示将符号导出到当前包之上的一个级别,也就是说,导出到使用模块的客户机代码。下面是您的
import()
方法需要执行的操作的概要

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

    # Do whatever you need to do with the LIST of arguments
    # supplied by the client code using your module.


    # Let Exporter do its normal work of exporting symbols
    # into the client code using your module.
    $class->export_to_level(1, @_);
}

是的,这是一个匿名散列。它作为一个参数传递给模块<代码>导入< /代码>方法.< /p> 直接回答您的问题:PAR为:

在“使用PAR”时调用 次级进口{ 我的$class=shift; [...] 我的@args=@; [...] 进程ARG使用PAR’Fo.PAR’,{opts },… foreach我的$par(@args){
if(ref($par)eq'HASH'){#“value”,key2=>“value2”,…}语法是匿名哈希的构造函数。这些文件被记录在文件中,但在友好的条件下解释。

哦。抱歉。我不明白什么允许语法工作。我对PAR模块本身不感兴趣,只是作者是如何做到这一点的。哈!在这种情况下,我刚刚提供了你问题的真正答案。
sub import {
    my ($class, @args) = @_;

    # Do whatever you need to do with the LIST of arguments
    # supplied by the client code using your module.


    # Let Exporter do its normal work of exporting symbols
    # into the client code using your module.
    $class->export_to_level(1, @_);
}
# called on "use PAR"
sub import {
    my $class = shift;
    [...]
    my @args = @_;
    [...]
    # process args to use PAR 'foo.par', { opts }, ...;
    foreach my $par (@args) {
        if (ref($par) eq 'HASH') { # <---- This is what handle's your case!
            # we have been passed a hash reference
            _import_hash_ref($par);
        }
        elsif ($par =~ /[?*{}\[\]]/) {
           # implement globbing for PAR archives
           [...]
        }
        else {
            # ordinary string argument => file
            [...]
        }
    }