Perl中的链式名称空间标识符有什么作用?

时间:2017-05-15 08:10:24

标签: perl oop

我找到了一个代码片段,如下所示:

package File::MP3;
use parent 'File';    # sets @File::MP3::ISA = ('File');
my $mp3 = File::MP3->new( 'Andvari.mp3', $data );
$mp3->save();

在这里,我想询问File::MP3是否只是一个名称(它的名称​​只是,以表明它继承自File

如果它继承自File

,我们必须这样命名

2 个答案:

答案 0 :(得分:3)

更新

  

我在Module.pm文件夹中创建了一个名为lib的模块,&然后将包命名为package lib::Module

你有点困惑

userequire被操作时,Perl会通过将My::Other::Module更改为My/Other/Module.pm等内容,从包名称中形成相对路径使用明显的替换

它将在内置@INC数组中的位置列表中查找相对路径,其中包含在构建perl时定义的一些路径以及可能在运行时添加的其他路径

直到最近,@INC包含当前工作目录.,因此,如果您的模块位于./lib/My/Other/Module.pm,那么Perl编译器会在use lib::My::Other::Module.pm找到它}。但这不是它的工作方式

您应该将./lib添加到@INC(使用use lib './lib' [1] 或添加到环境变量PERL5LIB的值)然后use My::Other::Module。这样可以正常工作,因为perl正在寻找./lib中的.pm文件。 .pm文件的名称和路径,package语句和use语句都应该同意名称

[1] 请注意,向@INC添加相对路径存在安全风险。这就是为什么.不再作为Perl v5.26的发布客户端中的标准包含的原因。这意味着你不应该如上所述use lib './lib'。相反,你需要像use lib '/var/users/Me/Perl/source/lib'

这样的东西


File::MP3这样的包名只是一个名称。 Perl的唯一要求是它必须是唯一的

但CPAN中的模块分为系列,大多数文件相关的模块以File::开头。还有Win32::Net::Math::等。

它还用于指示套件中的辅助模块。例如,Mojo::Message包含Mojo::Message::RequestMojo::Message::Response共有的代码。但这只是程序员方便的助记符

对于Math::Poisson,perl将查找文件Math/Poisson.pm,该文件应具有package声明package Math::Poisson。如果您在其他地方使用该包名称,那么您声明的任何内容都将插入到模块的命名空间

答案 1 :(得分:2)

package声明中的File::MP3只是一个名称。但是,如果你想要use那个包那么这个名字很重要。 use发送至requirerequire EXPR中的名称为

  

如果EXPR是一个单词,则需要假定 .pm 扩展名,并在文件名中替换:: /,以便加载标准模块。这种加载模块的方式不会有改变命名空间的风险。

因此,如果您想要use File::MP3,那么 MP3.pm 文件最好位于 File/ 目录中,这需要位于@INC中列出的(绝对路径)目录之一。

File继承的类File::MP3与目录 File/ 无关。 use parent(请参阅parent)独立指定要为类File加载的包,其 File.pm 文件也必须在@INC

包含的 MP3.pm 文件可能位于 Media/ 目录中,在这种情况下,最好将其命名为{{ 1}}并且会加载package Media::MP3; - 它仍然可以通过use Media::MP3;继承File

当然,将文件相关模块放在名为 use parent File; 的目录中确实有意义。