我正在创建一个与我的Python项目等效的Perl。
描述: 我有一个基本模块“base.py”,我的所有脚本都使用“from base import *” 基本模块具有可在脚本
内执行的公共子例程/函数我对Perl的尝试是在每个脚本中放置“use base.pm”。但是Perl中的子程序没有本地导入到脚本中,因此每次我想执行子程序时都需要调用“base”模块。什么是Perl相当于Python的“from base import *”?
答案 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专门保留Local
。 Local
名称空间中不会包含任何官方模块。如果您将完整命名空间作为前缀,则可以使用您在模块中定义的所有函数。这是从模块中定义和使用函数的最简单方法,并且最不可能导致问题。很容易看到函数的来源,使用相同的函数名称的两个模块也不会有问题。
我有一个名为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";
package Local::Base;
use strict;
use warnings;
sub foo {
my $string = shift;
return qq(I've foo'd "$string"!);
}
1;
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";
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/;
我喜欢括号,但正斜线往往是标准。
不建议您再使用自动导出。像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";
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。