这些Perl使用线会发生什么?

Geo*_*Geo 3 perl perl-module

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

use PAR { file => 'foo.par', fallback => 1 };
Run Code Online (Sandbox Code Playgroud)

我认为这是一个匿名哈希.一个模块如何use在线上使用它?你能解开一些光吗?

编辑:我对PAR模块不感兴趣.我只是对窗帘后面的工作方式感兴趣.如何配置我的模块?

Eth*_*her 7

更基本的是,这是有趣的hashref语法所做的(使用perldoc -f作为参考):

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

package Foo;

use Data::Dumper;
sub import
{
    print "import was passed these arguments: ". Dumper(\@_);
}

1;
Run Code Online (Sandbox Code Playgroud)

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

import was passed these arguments: $VAR1 = [
          'Foo',
          {
            'a' => 1,
            'b' => 2
          }
        ];
Run Code Online (Sandbox Code Playgroud)

基本上,这种语法让我们可以使用Exporter进行魔术,但实际上你可以import()做任何你喜欢的事情(只要确保记录很多,以免引起混淆!)


FMc*_*FMc 7

当您use使用模块时,可以将参数列表传递给它.在您的示例中(似乎有一个拼写错误,缺少结束引号),传递一个包含一个元素(哈希引用)的列表.

更普遍:

use Module LIST
Run Code Online (Sandbox Code Playgroud)

变成这样:

BEGIN {
    require Module;
    Module->import( LIST );
}
Run Code Online (Sandbox Code Playgroud)

BEGIN块确保所有内容都在编译时发生.该require加载模块到内存中,如果它不存在了.然后使用原始语句import()中传递的任何参数调用模块的方法.LISTuse

为了让您自己的模块使用这样LIST的参数执行某些操作,您的模块需要定义一个import()方法.许多模块不这样做; 相反,他们import()Exporter班上继承.有关更多详细信息,请参阅perldoc -f use.

如果您的模块定义了自己的import()方法,您需要自己将符号导出到客户端代码中,或者更常见的是,使用export_to_level()提供的方法Exporter.此方法的第一个参数是一个正整数,指定要将符号导出到的调用堆栈中的级别.最常见的值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, @_);
}
Run Code Online (Sandbox Code Playgroud)