相当于:进口*

时间:2012-12-31 21:42:15

标签: perl import perl-module

我正在创建一个与我的Python项目等效的Perl。

描述: 我有一个基本模块“base.py”,我的所有脚本都使用“from base import *” 基本模块具有可在脚本

内执行的公共子例程/函数

我对Perl的尝试是在每个脚本中放置“use base.pm”。但是Perl中的子程序没有本地导入到脚本中,因此每次我想执行子程序时都需要调用“base”模块。什么是Perl相当于Python的“from base import *”?

3 个答案:

答案 0 :(得分:3)

您通常指定要作为名称列表导入的函数:

use List::Util 'max', 'min';

导出内容的大多数模块都将遵循以下语义:

use MyBase; # imports default exports (if any)
use MyBase 'baz'; # imports only baz
use MyBase (); # import nothing

在模块内部,调用一个导入类方法,可以选择要导出的内容,通常具有默认列表,但如果有列表则使用传递的列表。 Exporter模块用于帮助您执行此操作:

package MyBase;
use Exporter 'import';
our @EXPORT = ( 'foo', 'bar' );
our @EXPORT_OK = ( 'baz', 'quux' );

还有一种工具可以按标签对导出进行分组,并允许轻松导入整个组,请参阅导出器文档。变量也可以导出,而不仅仅是潜艇。

有了这样的背景,最后回答你的问题:

对于使用Exporter(并非全部都是)的模块,您可以使用//:

中包含的正则表达式指定导入
use List::Util '/./';

答案 1 :(得分:3)

一些事情:

  • Local命名空间适合用于本地模块。出于此目的,Perl专门保留LocalLocal名称空间中不会包含任何官方模块。
  • Perl不是Python。 Perl会做一些不同的事情。有时会有一个完全相同的,有时不是。这没有完全等价物。关闭,但不准确。

方法#1:不导出任何函数

如果您将完整命名空间作为前缀,则可以使用您在模块中定义的所有函数。这是从模块中定义和使用函数的最简单方法,并且最不可能导致问题。很容易看到函数的来源,使用相同的函数名称的两个模块也不会有问题。

我有一个名为Local::Base的模块,其中包含一个函数。我的程序可以使用此功能,只需将其引用为Local::Base::foo

我的计划

use strict;
use warnings;
use feature qw(say);

use Local::Base;

my $foo_string = Local::Base::foo("string");
say "Foo: $foo_string";

本地/ Base.pm

package Local::Base;

use strict;
use warnings;

sub foo {
    my $string = shift;

    return qq(I've foo'd "$string"!);
}

1;

方法#2:使用Exporter Pragma指定自动导出内容

Perl有一个名为 Exporter 的特殊 pragma ,它允许我指定哪些模块会自动导入到我的程序中。

这与我可以指定任何已定义函数的Python不同。相反,我必须列出我想要导出的那些。这比Python的方式有一个缺点:在Python中,如果我编写一个新函数,它会自动导入而不需要我做任何事情。与Python的方式相比,它还有一个很大的优势:在Python中,如果我编写一个新函数,它会自动导入而无需我做任何事情 我是否想要导入 。你可以想象如果我写了一个我不想让人们使用的私人功能。在Python中,它会自动可用。在Perl中,除非我指定它,否则不会:

我的计划

use strict;
use warnings;
use feature qw(say);

use Local::Base;

my $foo_string = foo("string");
say "Foo: $foo_string";

本地/ Base.pm

package Local::Base;
use strict;
use warnings;

use Exporter 'import';

our @EXPORT = qw(foo);

sub foo {
    my $string = shift;

    return qq(I've foo'd "$string"!);
}

1;

现在,只要我使用Local::Base,就会自动导入foo功能。

请注意,我列出了我要在@EXPORT数组中导出的所有函数。 (另请注意,我使用our而不是my声明该数组。our表示@EXPORT是PACKAGE变量。)。另请注意qw(...)语法。这是引用词。所有单词都是数组的独立元素。你不使用逗号:

my @array = ("one", "two", "three");
my @array = qw(one two three);

这两者都是等价的。你也可以这样看:

my @array = qw/one two three/;

我喜欢括号,但正斜线往往是标准。

方法#3:导出时很好

不建议您再使用自动导出。像File::Copy这样的旧模块仍然可以做到,但是较新的模块会让你导入你的东西。这也使用了 Exporter 编译指示,但是我指定的是@EXPORT_OK而不只是@EXPORT

现在,当我指定要使用Local::Base时,我必须指定要导入程序的函数:

我的计划

use strict;
use warnings;
use feature qw(say);

use Local::Base qw(foo);

my $foo_string = foo("string");
say "Foo: $foo_string";

本地/ Base.pm

package Local::Base;
use strict;
use warnings;

use Exporter 'import';

our @EXPORT_OK; = qw(foo);

sub foo {
    my $string = shift;

    return qq(I've foo'd "$string"!);
}

1;

这会强制用户记录他们想要使用的模块中的功能。这样,他们知道导入函数的来源。它强制执行良好的编程习惯。另外,如果您使用多个模块并且它们具有相似的功能名称,则可以确保使用所需模块中的模块。 (请记住,如果要使用另一个,您仍然可以在函数前指定前缀的包名称。)

如果我是Python程序员并且我不关心良好的编程习惯会怎么样? (等等,这不是很正确......)你仍然可以通过指定正则表达式(在所有这些是Perl之后)以Python方式完成它:

use Local::Base '/.+/';

这将导出@EXPORT@EXPORT_OK中列出的与此正则表达式匹配的所有模块。由于此匹配所有内容,因此会导入您在@EXPORT@EXPORT_OK中列出的所有内容。它不会导入所有功能。它只会导入@EXPORT@EXPORT_OK数组中的函数。当然,您可以指定任何正则表达式甚至是蚂蚁正则表达式。这将导出除名称中包含bar的函数之外的所有可导出函数:

use Local::Base '!/bar/';

看看Exporter pragma,看看它有什么其他好处。例如,您可以将函数分组为标记。这样,用户可以仅使用标记指定一组特定的功能。请参阅Math::Trig以获取一个好例子。

希望这有帮助。

很抱歉答案很长,但我和孩子们结婚了。就像,我在新年前夜做了其他事情。

答案 2 :(得分:1)

首先,base.pm是一个非常糟糕的名称,因为它是一个核心模块。其次,必须声明可导出函数(通常),例如,请参阅Exporter