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. 注意:在Unix和其他文件/目录命名区分大小写的操作系统上,模块名称明显区分大小写. 从@INC获取下一个目录 – 以/usr/lib / perl为例 我们来看一个具体的例子,假设你的@INC包含两个子目录: 那么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指令本身 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |