例如,如果程序包含:
use MyModule1; # Example 1 use This::Here::MyModule2; # Example 2
它会在哪里看?
解决方法
@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”)