我找到了一个代码片段,如下所示:
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
?
答案 0 :(得分:3)
我在
Module.pm
文件夹中创建了一个名为lib
的模块,&然后将包命名为package lib::Module
你有点困惑
当use
或require
被操作时,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::Request
和Mojo::Message::Response
共有的代码。但这只是程序员方便的助记符
对于Math::Poisson
,perl将查找文件Math/Poisson.pm
,该文件应具有package
声明package Math::Poisson
。如果您在其他地方使用该包名称,那么您声明的任何内容都将插入到模块的命名空间
答案 1 :(得分:2)
package声明中的File::MP3
只是一个名称。但是,如果你想要use那个包那么这个名字很重要。 use
发送至require,require 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;
的目录中确实有意义。