Perl程序如何知道在哪里可以找到包含Perl模块的文件?

前端之家收集整理的这篇文章主要介绍了Perl程序如何知道在哪里可以找到包含Perl模块的文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我的Perl程序使用Perl模块,它将如何确定在哪里找到包含模块代码文件

例如,如果程序包含:

use MyModule1;              # Example 1
use This::Here::MyModule2;  # Example 2

它会在哪里看?

解决方法

Perl解释器(运行您的perl程序)将使用一个名为@INC的特殊数组来搜索包含该模块的文件.

@INC数组中的每个值都是一个目录名(请参见下面的注释); Perl将使用下面指定的规则在循环中搜索这些目录. (请参考this SO post for details of how the contents of @INC are determined).

如果在耗尽@INC后找不到模块的文件,程序的编译将会中止并出现错误.如果在@INC中指定的目录中找到该模块的文件,则搜索结束,而不查看@INC的其余部分.

Perl在@INC中列出的每个目录中搜索模块文件的方式如下:

>首先,它会将模块名称的分层组件(由:)分隔的单词分隔为最后一个组件 – 将用于形成文件名)和层次结构路径(所有组件在最后一个:)之间.

如果模块名称只有一个组件(否,例如上面的MyModule1),则层次结构路径为空,文件名为模块的名称.在这个问题的第二个例子中,最后一个组件是MyModule2,层次结构路径将是This :: Here.
>预期文件名将通过以.pm扩展名附加模块名称的最后一个组件来确定.例如. MyModule1.pm和MyModule2.pm在我们的例子中.

注意:在Unix和其他文件/目录命名区分大小写的操作系统上,模块名称明显区分大小写.
>该模块的目录将由以下确定:

从@INC获取下一个目录 – 以/usr/lib / perl为例
>通过采用模块名称的层次结构路径(如果有的话)和/或用操作系统用作目录分隔符的任何字符替换“::”来形成该目录的子目录.在我们的两个示例中,第一个模块将在/usr/lib / perl(无子目录)中搜索,第二个模块将在/usr/lib / perl / This / Here中搜索.
>注意:上述是一个简单的简化 – @INC may also contain subroutine references and object references,它们按照自己的自定义代码指定的方式加载模块,而不是在#2逻辑上面指定的目录中执行查找.该功能似乎很少被使用,本文假设整个@INC只包含目录.

我们来看一个具体的例子,假设你的@INC包含两个子目录:
(“/usr/lib / perl”,“/ opt / custom / lib”).

那么Perl会搜索如下:

==========================================================================
| Module                | Try # | File to try               
==========================================================================
| MyModule1             | Try 1 | /usr/lib/perl/MyModule1.pm
| MyModule1             | Try 2 | /opt/custom/lib/MyModule1.pm
==========================================================================
| This::Here::MyModule2 | Try 1 | /usr/lib/perl/This/Here/MyModule2.pm
| This::Here::MyModule2 | Try 2 | /opt/custom/lib/This/Here/MyModule2.pm
==========================================================================

请记住,Perl解释器将在其中一个位置找到该文件后,停止尝试搜索,而不尝试查看该文件是否在以后的位置.例如.如果/usr/lib/perl/This/Here/MyModule2.pm存在,那么Perl不会寻找/opt/custom/lib/This/Here/MyModule2.pm的存在,也不在乎.

注意:每当Perl解释器使用需要类似机制导入Perl模块时,都会使用@INC.这包括

> require指令本身
>使用MyModule语句(相当于需要导入)
> use base(相当于要求“推@ISA”)

猜你在找的Perl相关文章