使用它时将参数传递给perl包

问题描述 投票:5回答:3

如何在使用包时传递一些参数,例如:

use Test::More tests => 21;   

我无法找到有关此专长的任何有价值的文件。传递这些论点是否有任何利弊?

perl arguments packages
3个回答
4
投票

use My::Module LIST做了两件事:1)它requires My::Module; 2)调用My::Module->import(LIST)

因此,您可以编写模块的import例程来处理以任何方式传递的参数列表。如果您确实正在编写一个不向调用者命名空间导出任何内容的面向对象模块,这将变得更加容易。

这是一个相当无意义的例子:

package Ex;

use strict;
use warnings;

{
    my $hello = 'Hello';
    sub import {
        my $self = shift;
        my $lang = shift || 'English';
        if ($lang eq 'Turkish') {
            $hello = 'Merhaba';
        }
        else {
            $hello = 'Hello';
        }
        return;
    }

    sub say_hello {
        my $self = shift;
        my $name = shift;

        print "$hello $name!\n";
        return;
    }
}

__PACKAGE__;
__END__

以及使用它的脚本:

#!/usr/bin/env perl

use strict;
use warnings;

use Ex 'Turkish';
Ex->say_hello('Perl');

Ex->import;
Ex->say_hello('Perl');

输出:

$ ./imp.pl
Merhaba Perl!
Hello Perl!

2
投票

有些人可能会说它在某些情况下更具可读性,但实质上它与之相同

use Test::More qw(tests 21);

test由胖逗号=>自动引用,数字不需要引用)。


0
投票

主要的缺点是你不能使用import的默认Exporter子程序,它只需要一个符号列表(或表示符号集合的标签)导入到调用包中

Test::More从超类import继承了一个自定义Test::Builder::Module例程,该例程使用use语句中提供的参数来配置测试计划。它还使用Exporter来处理像import => [qw/ symbols to import /]这样指定的选项

如果你有一个特定的要求,几乎任何东西都可以通过自定义的import子程序来完成,但是偏离标准的面向对象语义可能是不明智的

© www.soinside.com 2019 - 2024. All rights reserved.