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

2024-05-21

如果我的 Perl 程序使用 Perl 模块,它将如何确定在哪里找到包含模块代码的文件?

例如,如果程序包含:

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

它会看起来在哪里?


Perl 解释器(运行你的 Perl 程序)将使用一个特殊的数组,称为@INC搜索包含该模块的文件。

中的每个值@INC数组是目录名称(但请参阅下面的注释); Perl 将使用下面指定的规则在循环中搜索这些目录。 (请参阅这篇 SO 帖子详细介绍了如何确定 @INC 的内容 https://stackoverflow.com/questions/2526804/how-is-perls-inc-constructed-aka-what-are-all-the-ways-of-affecting-where-per).

如果穷尽之后没有找到模块的文件@INC,程序的编译将因错误而中止。如果在指定的目录之一中找到模块的文件@INC,搜索完成,无需查看其余部分@INC.

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

  • 首先,它将分隔模块名称的分层组件(用 分隔的单词)::),进入最后一个组件(将用于形成文件名)和层次结构路径(最后一个组件之前的所有组件)::).

    如果模块名称只有一个组成部分(没有::, e.g. MyModule1上面),层次结构路径为空,文件名是模块的名称。在这个问题的第二个例子中,最后一个组件是MyModule2层次结构路径将是This::Here.

  • 预期的文件名将通过在模块名称的最后一个部分附加一个.pm扩大。例如。MyModule1.pm and MyModule2.pm在我们的例子中。

    注意:在 Unix 和其他文件/目录命名区分大小写的操作系统上,模块名称显然区分大小写。

  • 模块的目录将由以下因素确定:

    1. 从中获取下一个目录@INC- 比方说/usr/lib/perl举个例子

    2. 通过获取模块名称(如果有)的层次结构路径并将“::”替换为该目录的子目录/或操作系统用作目录分隔符的任何字符。在我们的两个示例中,将在以下位置搜索第一个模块/usr/lib/perl(无子目录)和第二个/usr/lib/perl/This/Here.

    3. NOTE:上面是稍微简化的 -@INC 还可能包含子例程引用和对象引用 https://stackoverflow.com/questions/2541119/when-is-a-subroutine-reference-in-inc-called,它按照自定义代码指定的方式加载模块,而不是按照上面#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 解释器使用时,都会使用 @INCrequire类似导入 Perl 模块的机制。这包括:

  • require指令本身
  • use MyModule语句(相当于require+import)
  • use base http://search.cpan.org/~rgarcia/base-2.14/lib/base.pm(相当于require+"push @ISA")
  • -M命令行参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl 程序如何知道在哪里可以找到包含它使用的 Perl 模块的文件? 的相关文章

  • Perl 中的 Fork 无法在从文件读取的 while 循环内工作

    我正在运行一个 while 循环来读取文件中的每一行 然后使用该行的数据将进程分叉给子进程 N 行之后 我想等待子进程结束并继续接下来的 N 行 等等 它看起来像这样 while w
  • 标量值错误(使用 IO::Socket)

    这是我当前的代码 usr bin perl w use strict require IO Socket while lt gt chomp my host my header print Connecting to host n my s
  • Perl Moose TypeDecorator 错误。我该如何调试?

    我最近遇到了一个问题 非常感谢您的见解 我在圣诞节前在 PerlMonks 上发布了类似的问题 并提供了一些从 MooseX Declare 切换的反馈 http www perlmonks org node id 877703 1 我现在
  • cygwin中刷新windows用户的环境变量

    我想在执行 setx VARNAME VARVALUE 特别是路径 后刷新 cygwins 环境 export VARNAME VARVALLUE 不是一个选项 因为如果导出的值是路径 类似于 UNIX 格式 我需要转换导出的值 但 VAR
  • 如何在没有循环的情况下初始化哈希中的值?

    我正在尝试找出一种无需经过循环即可初始化哈希的方法 我希望使用切片来实现这一点 但它似乎没有产生预期的结果 考虑以下代码 usr bin perl use Data Dumper my hash hash currency symbol B
  • 使用 Perl 循环 JSON [重复]

    这个问题在这里已经有答案了 我是 Perl 的新手 想要循环这个 JSON 数据并将其打印到屏幕上 我怎样才能做到这一点 arr Year 2012 Quarter Q3 DataType Other 3 Environment STEVE
  • Phonegap cordova android“项目已存在”或运行时错误

    我在这里发帖是因为这让我发疯 我正在尝试让 PhoneGap 正常工作 我安装了 ADT 捆绑包 eclipse adt 插件 android SDK gt 顺便说一句 他们真的应该更新phonegap入门教程 该教程仍然告诉您单独安装所有
  • EF Core 第二级 thenIninclude 错误

    假设首先有这些模型 Method有一个OriginalCode OriginalCode那有很多Mutants Mutant那有很多ParseSubTrees 现在当查询时Method我希望加载另一个 所以我有以下内容 Method tar
  • 使用perl,在每行都有相同单词的情况下如何选择最后两行?

    Bini 21 89753 20 47853 20 27835 18 34952 16 23454 Bini 16 89753 14 47853 13 27835 12 34952 11 23454 Bini 10 09014 我的文件有一
  • 在 SVG 路径中动态创建渐变层

    我正在使用 SVG 创建动态路径 我现在希望在我的路径中添加渐变 但我被困住了 按照我尝试的方式 我的渐变沿着图 2 所示的路径进行 而我要求它是图 1 中的那种 Current 我的渐变和描边定义如下
  • 如何在 Perl 中使用 use strict 一次一行处理多行字符串?

    我正在尝试找出 PBP 批准的正确方法来一次一行处理多行字符串 许多 Perl 编码人员建议将多行字符串视为文件句柄 除非您在脚本中使用 use strict 否则它可以正常工作 然后 您会收到编译器发出的警告 提示在使用严格引用时无法使用
  • 如何确保我的代码永远不会直接退出?

    eval require file subsequent code goes here If file包含一个exit语句 后面的代码就没有机会运行 如何解决以便后续代码始终有机会运行eval已经完成了 中止是不可能的exit call f
  • 以不敏感的方式在 bash 中查找路径

    假设一条路径像 home albfan Projects InSaNEWEBproJECT 尽管事实上不使用这样的名称 有没有办法以不敏感的方式检查路径 我遇到了这个解决方案 但如果可能的话 我想找到一个内置或 gnu 程序 functio
  • 使用 SIGINT 默认处理程序时从 system() 返回值

    我遇到了一些奇怪的返回值system 当子进程从终端接收到 SIGINT 时 解释一下 从 Perl 脚本parent pl I used system 运行另一个 Perl 脚本作为子进程 但我还需要通过 shell 运行子进程 所以我使
  • Perl 非贪婪

    我遇到非贪婪正则表达式 regex 的问题 我已经看到有关于非贪婪正则表达式的问题 但它们没有回答我的问题 Problem 我正在尝试匹配 lol 锚点的 href Note 我知道这可以通过 Perl HTML 解析模块来完成 我的问题是
  • 根据插入顺序迭代哈希?

    不想对条目进行排序 使用它也不会保留顺序 foreach my val keys hash 默认情况下 Perl 5 中的哈希值是无序的 您可以使用tie http perldoc perl org functions tie html a
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • perl-5.10 之前的高效版本相当于 pack("Q>")

    更新 萨尔瓦正确地指出我对 Q 包模板的介绍是错误的 这是 gt 修饰符 不会返回到 5 8 Perl 5 10 引入了 pack 修饰符 gt 对于我使用 Q 的用例 它将一个无符号四边形 64 位 值打包在大尾数法 现在 我正在寻找一个
  • 使用 LWP::Agent 的 Perl JSON::RPC::Client

    我被要求不使用 JSON RPC Client 而是使用 LWP 进行调用 这是我的代码 Server usr bin perl use strict use lib use ServerLib use JSON RPC Server Da
  • 在 Perl 中如何用空格填充字符串的一部分?

    你更喜欢哪个版本 usr bin env perl use warnings use strict use 5 010 my p 7 33 my prompt my key very important text my value Hell

随机推荐

  • 如何强制 pm2 在特定时间后重新启动?

    我在用PM2让我的 Node js 应用程序保持运行 有什么办法可以拥有PM2每 1 小时重新启动一次我的应用程序 将下面的代码放入pm2 js并开始它pm2 start pm2 js var pm2 require pm2 pm2 con
  • 共享辅助轴

    如何使用 matplotlib 中的子图设置共享辅助轴 这是显示问题的最少代码 import numpy as np import matplotlib as mpl import matplotlib pyplot as plt def
  • 如何将包含大量表格的 HTML 文档转换为 Word 文档?

    我创建了一个包含许多表格的 HTML 文档 如何将文档转换为Word 问题是 如果我用 Word 打开 HTML 文档 由于某种原因我会得到非标准的双行表格 table border 1 color 000000 cellpadding 0
  • 由于缺少 PHP 扩展,CakePHP 3 无法连接到数据库

    我正在尝试使用 WT NMP 安装 cakePHP 3 0 0 但收到以下消息 CakePHP 无法连接到数据库 由于以下原因无法使用数据库驱动程序 Cake Database Driver Mysql 缺少 PHP 扩展或未满足的依赖项
  • 如何让 Vim 突出显示非 ascii 字符?

    我试图让 Vim 突出显示非 ASCII 字符 是否有可用的设置 正则表达式搜索模式或插件来执行此操作 在 a 中使用范围 搜索中的字符类 您应该能够excludeASCII 十六进制字符范围 因此突出显示 假设您有hlsearch启用 所
  • 依赖解析算法

    我正在编写一个包管理器 为此我希望依赖项解析尽可能强大 每个包都有一个版本列表 每个版本包含以下信息 具有可比性的 ID 依赖关系 软件包列表以及每个软件包的一组可接受的版本 冲突 软件包列表以及每个软件包的一组与该版本一起导致问题的版本
  • 查看寻呼机 - 使用静态变量以编程方式滑动到下一页

    我想在我的 ViewPager 中以编程方式制作幻灯片 我的问题是 滑动事件是由放置在 ViewPager 保存的片段内部的按钮调用的 我知道代码 viewpager setCurrentItem int index 现在我的想法是使 Vi
  • 将用户定义的表类型从 VBA 传递到 SQL

    我的任务是创建一个 Excel 电子表格作为 SQL 数据库的前端 以及一些对数据执行复杂计算的 C 我的老板想要前端作为电子表格 而计算对于 VBA 来说似乎太复杂了 目前 检索数据集的存储过程运行良好 然后 用户将在 Excel 中编辑
  • Lua中有状态迭代器和无状态迭代器的区别

    Lua中无状态和有状态迭代器有什么区别 请详细解释一下 什么时候需要使用无状态 什么时候需要使用另一种 我需要例子来理解这个概念 首先让我们就一个定义达成一致 在 Lua 中 迭代器是function 类似对象 每次调用时都会返回序列中的下
  • ListView 中的错误:InvalidArgument = 值“0”对于“index”无效

    当我第二次选择 ListView 中的某个项目时 会出现此错误 我尝试调试它 当我第二次选择某个项目时 list answers SelectedItems Count是0 为什么呢 这是我的代码 private void list ans
  • 如何使用 jquery ajax 将锚点的值发送到 php

    我正在尝试使用 jquery 将几个锚点的值发送到 php 文件 但我没有从 php 脚本中得到回调 div class result div a href value class star Star 5 a a href value cl
  • 模板函数静态变量

    我有一个模板函数可以根据typename传递给它 就像这样 template
  • 理解基本递归

    public static void main String args System out println factorial 5 public int factorial int n if n lt 1 return 1 else re
  • 如何使用 php imap 将邮件消息移动到文件夹

    我似乎无法将邮件移至已保存的文件夹 这是我的代码 mbox imap open mail server mail port mail folder mail username mail password or die Error openi
  • 函数式 Scala 中的选择排序

    我正在学习 Scala 编程 并编写了选择排序算法的快速实现 然而 由于我对函数式编程还不太了解 所以在转换为更 Scala 风格时遇到了困难 对于 Scala 程序员来说 如何使用 Lists 和 vals 来做到这一点 而不是回到我的命
  • 重定向而不是 404 错误页面 - 状态代码不起作用 (Nginx)

    我目前正在迁移到 nginx 服务器 我尝试将其放入名为的 404 ErrorDocument 中404 php 如果我现在尝试访问http mydomain com 404 php 这按预期工作 它将我重定向到 Google 但是一旦我尝
  • 监听来自动态vue组件的事件

    您将如何侦听动态创建的组件实例发出的事件 在示例中 顶部组件添加到 DOM 中 而第二个组件是在 javascript 中动态创建的 Vue component button counter data function return cou
  • C# 中将字符串 (yyyyMMddhhmm) 转换为 DateTime 的函数

    在我的数据库中 我有一个日期类型的字段varchar其中日期以以下格式存储yyyyMMddhhmm 没有空格或其他字符分隔它们 现在我需要将此日期与 C 进行比较DateTime 因此我需要将字符串转换为DateTime 我能想到的最合乎逻
  • net.sf.jasperreports.engine.JRException:从 bean 检索字段值时出错:First_name

    我想使用 Jasper Reports 创建 CSV 有很多相关的问题 但没有任何对我有用 下面是我的 Bean 类 public class DataBean public String First name public String
  • Perl 程序如何知道在哪里可以找到包含它使用的 Perl 模块的文件?

    如果我的 Perl 程序使用 Perl 模块 它将如何确定在哪里找到包含模块代码的文件 例如 如果程序包含 use MyModule1 Example 1 use This Here MyModule2 Example 2 它会看起来在哪里