perlmodlib - 构建新的 Perl 模块并查找现有的模块
Perl 发行版中包含许多模块。这些模块在下面描述,并且都以 .pm 结尾。您可能会发现编译后的库文件(通常以 .so 结尾)或要自动加载的小模块片段(以 .al 结尾);这些文件是在安装过程中自动生成的。您还可能会在库目录中发现以 .pl 或 .ph 结尾的文件。这些是提供的旧库,以便使用它们的旧程序仍然可以运行。.pl 文件最终将全部转换为标准模块,而由 h2ph 生成的 .ph 文件可能会最终成为由 h2xs 生成的扩展模块。(某些 .ph 值可能已经可以通过 POSIX、Errno 或 Fcntl 模块获得。)发行版中的 pl2pm 文件可能有助于您的转换,但它只是一个机械过程,因此远非万无一失。
它们的工作方式有点像编译器指令(pragma),因为它们往往会影响程序的编译,因此通常只有在use
或no
中使用时才能正常工作。大多数这些指令是词法作用域的,因此内部 BLOCK 可以通过以下方式来抵消它们
no integer;
no strict 'refs';
no warnings;
它一直持续到该 BLOCK 的末尾。
一些 pragma 是词法作用域的,通常是那些影响$^H
提示变量的 pragma。其他 pragma 影响当前包,例如use vars
和use subs
,它们允许你在特定文件中预先声明变量或子程序,而不仅仅是块。此类声明对声明它们的整个文件有效。你无法使用no vars
或no subs
撤销它们。
以下 pragma 已定义(并有自己的文档)。
获取/设置子程序或变量属性
用在词法作用域内成功或死亡的函数替换函数
来自自动死亡函数的异常。
来自自动死亡 system() 的异常。
提供有关用户子程序的提示给 autodie
在抛出 autodie 异常时跳过一个包
将模块的加载推迟到函数使用时
在编译时建立与基类的 ISA 关系
为 Perl 提供透明的大浮点数支持
为 Perl 提供透明的大整数支持
为 Perl 提供透明的大数支持
为 Perl 提供透明的大有理数支持
使用 MakeMaker 未安装版本的包
导入内置实用程序函数
公开字符的各个字节
访问 Unicode 字符名称和命名字符序列;也定义字符名称
声明常量
Perl 编译指令,用于弃用在核心代码中包含模块
生成详细的警告诊断信息
允许您使用非 ASCII 和非 UTF-8 编码编写脚本
在隐式编码转换时发出警告
简化实验性功能的使用
启用新功能
编译时类字段
控制文件测试权限运算符
如果条件成立,则use
Perl 模块
使用整数运算而不是浮点运算
请求更少的东西
在编译时操作 @INC
对内置操作使用或避免 POSIX 本地化
方法解析顺序
Test::More::use_ok 的替代方案
为输入和输出设置默认 PerlIO 层
在编译时限制不安全操作
用于重载 Perl 操作的包
词法控制重载
在编译时建立与基类的 ISA 关系
更改正则表达式的行为
启用简单的信号处理
控制 sort() 的行为
简化实验性功能的使用,一旦我们知道它们是稳定的
限制不安全结构
预声明子程序名称
基于 Perl 解释器的线程
用于在线程之间共享数据结构的 Perl 扩展
启用/禁用源代码中的 UTF-8(或 UTF-EBCDIC)
预先声明全局变量名
用于版本对象的 Perl 扩展
控制 VMS 特定的语言特性
控制可选警告
警告导入函数
标准的捆绑模块都期望在命名空间污染方面表现良好,因为它们使用 Exporter 模块。有关详细信息,请参阅它们自己的文档。
并非所有列出的模块都安装在您的系统上。例如,如果您没有 gdbm 库,则不会安装 GDBM_File 模块。
用于 ARexx 支持的 Perl 扩展
用于低级 Amiga 支持的 Perl 扩展
为多个 DBM 提供框架
从命令行轻松与 CPAN 交互
实现 prove
命令。
prove
命令的状态存储。
单个测试套件结果。
单个测试结果。
用于操作 tar 档案的模块
Archive::Tar 中内存中提取文件的子类
属性处理程序的简化定义
仅按需加载子例程
拆分一个包以进行自动加载
Perl 编译器后端
遍历 Perl 语法树,打印关于操作的简洁信息
Perl 编译器后端,用于生成 Perl 代码
OP op_private 标志定义
显示函数或文件中使用的词法变量
遍历 Perl 语法树,打印关于操作的简短信息
为 Perl 程序生成交叉引用报告
对 Perl 代码的运行时间进行基准测试
IO::Socket::IP
支持 IPv4 和 IPv6 的族中立 IP 套接字
Socket
网络常量和支持函数
Perl 核心例程的命名空间
从 CPAN 站点查询、下载和构建 Perl 模块
使用 CPAN.pm 进行编程的食谱
CPAN.pm 的内部调试
读取和匹配 distroprefs
CPAN::Config 文件初始化的实用程序
CPAN.pm 的内部配置处理
CPAN.pm 和 Kwalify.pm 之间的接口
CPAN 分发的发行版元数据
转换 CPAN 分发元数据结构
CPAN 分发提供的可选功能
CPAN 元数据规范变更历史
META.yml 的 1.0 版本元数据规范
META.yml 的 1.1 版本元数据规范
META.yml 的 1.2 版本元数据规范
META.yml 的 1.3 版本元数据规范
META.yml 的 1.4 版本元数据规范
合并 CPAN 元数据片段
按阶段和类型划分的一组发行版先决条件
CPAN 发行版的一组版本要求
CPAN 发行版元数据的规范
验证 CPAN 发行版元数据结构
读取和写入 CPAN 元数据文件的一组 YAML 子集
CPAN.pm 的包装器,不使用任何 XS 模块
CPAN shell 扩展的基类
一个简单的 CPAN::Plugin 的概念验证实现
CPAN.pm 的内部队列支持
CPAN.pm 的 tar 档案的内部处理
用于比较 CPAN 版本的实用程序函数
模块的替代 warn 和 die
将类似结构的数据类型声明为 Perl 类
bzip2 压缩库的低级接口
zlib 或 zlib-ng 压缩库的低级接口
zlib 压缩库的接口
访问 Perl 配置信息
哈希查找哪些核心扩展被构建。
perl -V 输出的结构化数据检索
获取当前工作目录的路径名
Perl 调试 API 的编程接口
过滤 DBM 键/值
DBM_Filter 的过滤器
DBM_Filter 的过滤器
DBM_Filter 的过滤器
DBM_Filter 的过滤器
DBM_Filter 的过滤器
Perl5 访问 Berkeley DB 版本 1.x
字符串化的 perl 数据结构,适合打印和 eval
Perl/污染/可移植性
XS 程序员的数据调试工具
为自加载模块生成存根
计算消息摘要的模块
Perl 对 MD5 算法的接口
Perl 扩展,用于 SHA-1/224/256/384/512
摘要基类
计算文件的摘要
(已过时) 为目录句柄提供对象方法
提供 Perl 数据的屏幕转储。
将 C 库动态加载到 Perl 代码中
Perl 中的字符编码
编码的别名定义
单字节编码
Encode::??::ISO_2022_* 内部使用
中国大陆的中文编码
Encode::CN 内部使用
Encode 内部使用
EBCDIC 编码
面向对象的编码器
编码实现基类
ETSI GSM 03.38 编码
从数据中猜测编码
日语编码
Encode::JP::2022_JP* 内部使用
Encode::JP 内部使用
韩语编码
Encode::KR 内部使用
用于非结构化电子邮件头的 MIME 编码
Encode 内部使用
关于 Encode 和 PerlIO 的详细文档
Encode 支持的编码
符号编码
台湾地区的中文编码
各种 Unicode 转换格式
UTF-7 编码
使用友好的英文(或 awk)名称来代替难看的标点符号变量
Perl 模块,将环境变量导入为标量或数组
系统 errno 常量
为模块实现默认导入方法
Exporter 的核心部分
为 Perl 模块编译和链接 C 代码
Windows 平台的构建器类
用于在 Makefile 等文件中替换常见 UNIX 命令的实用程序
MM 在 Makefile 中使用的命令
生成 XS 代码以导入 C 头文件常量
ExtUtils::Constant 对象的基类
ExtUtils::Constant 的辅助函数
为 XS 模块的常量生成 C 代码。
在 C/C++ 应用程序中嵌入 Perl 的实用程序
将文件从这里安装到那里
已安装模块的库存管理
确定要使用的库以及如何使用它们
针对操作系统的 ExtUtils::MakeMaker 子类
ExtUtils::MM_Unix 的 AIX 特定子类
与平台无关的 MM 方法
用于覆盖 ExtUtils::MakeMaker 中 UN*X 行为的方法
用于覆盖 ExtUtils::MakeMaker 中 UN*X 行为的方法
ExtUtils::MM_Unix 的 DOS 特定子类
OS X 的特殊行为
曾经为 MacOS Classic 生成的 Makefile
用于覆盖 ExtUtils::MakeMaker 中 UN*X 行为的方法
用于覆盖 ExtUtils::MakeMaker 中 UN*X 行为的方法
OS390 特定的 ExtUtils::MM_Unix 子类
QNX 特定的 ExtUtils::MM_Unix 子类
U/WIN 特定的 ExtUtils::MM_Unix 子类
ExtUtils::MakeMaker 使用的方法
用于覆盖 ExtUtils::MakeMaker 中 UN*X 行为的方法
VOS 特定的 ExtUtils::MM_Unix 子类
用于覆盖 ExtUtils::MakeMaker 中 UN*X 行为的方法
用于为 Win9X 定制 MakeMaker 的方法
用于定制的 ExtUtils::MakeMaker 子类
创建模块 Makefile
Config.pm 的包装器
关于 MakeMaker 的常见问题解答
捆绑的 Encode::Locale
使用 MakeMaker 编写模块
用于编写和检查 MANIFEST 文件的实用程序
编写 miniperlmain.c 和 perlmain.c 的 C 代码
为 DynaLoader 创建引导文件
为动态扩展编写链接器选项文件
在 Windows 上运行 Perl 脚本的批处理文件创建
管理 .packlist 文件
将 Perl XS 代码转换为 C 代码
一些全局变量的初始化值
用于评估代码的干净包
与 ExtUtils::ParseXS 一起使用的子例程
读取/写入/修改 Perl/XS 类型映射文件
处理类型映射的快速命令
类型映射 INPUT 部分的条目
类型映射 OUTPUT 部分的条目
类型映射 TYPEMAP 部分的条目
保持符号名称集对 VMS 链接器友好
将 blib/* 目录添加到 @INC
用等效函数替换函数,这些函数成功或死亡
加载 C Fcntl.h 定义
将文件路径解析为目录、文件名和后缀。
比较文件或文件句柄
复制文件或文件句柄
类似 DOS 的通配符,以及更多
通用的文件获取机制
遍历目录树。
Perl 扩展,用于 BSD glob 例程
扩展文件 Glob 以允许输入和输出文件
创建或删除目录树
可移植地对文件名执行操作
AmigaOS 的 File::Spec
Cygwin 文件规范的方法
Epoc 文件规范的方法
可移植地对文件名执行操作
Mac OS(经典)的 File::Spec
OS/2 文件规范的方法
Unix 的 File::Spec,其他 File::Spec 模块的基础
VMS 文件规范的方法
Win32 文件规范的方法
安全地返回临时文件的名字和句柄
Perl 内置 stat() 函数的按名称接口
保持比系统允许的更多文件打开
为文件句柄提供对象方法
简化的源代码过滤
Perl 源代码过滤器实用程序模块
定位原始 perl 脚本的目录
Perl5 对 gdbm 库的访问。
扩展的命令行选项处理
处理带开关聚类的单字符开关
一个小型、简单、正确的 HTTP/1.1 客户端
通用哈希子例程的集合
支持内向类
根据当前区域设置比较 8 位标量数据
处理 RFC3066 风格语言标签的函数
检测用户的语言偏好
人类语言的标签和名称
查询区域设置信息
加载各种 IO 模块
IO::Compress 模块的基类
写入 bzip2 文件/缓冲区
写入 RFC 1950 文件/缓冲区
关于 IO::Compress 的常见问题解答
写入 RFC 1952 文件/缓冲区
写入 RFC 1951 文件/缓冲区
写入 zip 文件/缓冲区
为目录句柄提供对象方法
为文件句柄提供对象方法
为 I/O 句柄提供对象方法
为管道提供对象方法
系统轮询调用的对象接口
为 I/O 对象提供基于查找的方法
OO 接口到 select 系统调用
套接字通信的对象接口
AF_INET 域套接字的对象接口
AF_UNIX 域套接字的对象接口
解压缩基于 zlib 的(zip、gzip)文件/缓冲区
解压缩 gzip、zip、bzip2、zstd、xz、lzma、lzip、lzf 或 lzop 文件/缓冲区
IO::Uncompress 模块的基类
读取 bzip2 文件/缓冲区
读取 RFC 1952 文件/缓冲区
读取 RFC 1950 文件/缓冲区
读取 RFC 1951 文件/缓冲区
读取 zip 文件/缓冲区
IO:: 风格接口到 Compress::Zlib
轻松查找和运行系统命令
SysV Msg IPC 对象类
使用 open2() 打开用于读写进程
使用 open3() 打开用于读、写和错误处理的进程
SysV 信号量 IPC 对象类
SysV 共享内存 IPC 对象类
System V IPC 常量和系统调用
为内部相关函数保留的特殊命名空间
与 JSON::XS 兼容的纯 Perl 模块。
提供 JSON::PP::Boolean 的虚拟模块
一系列通用的列表子例程
指示 List::Util 是否使用 C 编译器编译
本地化框架
使用 Locale::Maketext 的食谱
加载 Locale::Maketext utf8 代码的已弃用模块
加载 Locale::Maketext utf8 代码的已弃用模块
Locale::Maketext::Lexicon 的简单接口
关于软件本地化的文章
Base64 字符串的编码和解码
可打印引号字符串的编码和解码
任意大小浮点数数学包
任意大小整数数学包
支持 Math::BigInt 的纯 Perl 模块
Math::BigInt::Calc,使用一些 XS 以提高速度
Math::BigInt 库的虚拟父类
任意大小有理数数学包
复数和相关的数学函数
三角函数
通过用空间换时间来使函数更快
用于为 Storable 提供 AnyDBM_File 的 EXISTS 胶水
用于自动过期记忆值的插件模块
用于为 Storable 提供 NDBM_File 的 EXISTS 胶水
已弃用兼容性垫片
将记忆数据存储在 Storable 数据库中
Perl 版本附带的模块
Perl 版本附带的实用程序
模块和文件的运行时要求
在运行时查找模块信息/加载
将模块标记为已加载或未加载
从 Perl 模块文件中收集包和 POD 信息
对 ndbm 文件的绑定访问
提供一个伪类 NEXT(等等),允许方法重新调度
网络命令类(如 FTP、SMTP 等使用)
libnet 的本地配置数据
尝试评估当前主机的互联网名称和域
FTP 客户端类
FTP 客户端数据连接类
NNTP 客户端类
对用户 netrc 文件的 OO 接口
邮局协议 3 客户端类 (RFC1939)
检查远程主机是否可达
简单邮件传输协议客户端
时间和日期网络客户端接口
Perl 内置 gethost*() 函数的按名称接口
Libnet 常见问题解答
Perl 内置 getnet*() 函数的按名称接口
Perl 内置 getproto*() 函数的按名称接口
Perl 内置 getserv*() 函数的按名称接口
Perl 编译器后端的通用接口
绑定访问 odbm 文件
在编译 Perl 代码时禁用命名操作码
Perl 对 IEEE Std 1003.1 的接口
通用的输入解析/检查机制。
解析 META.yml 和 META.json CPAN 元数据文件
将 Perl 操作系统名称映射到通用类型
PerlIO 层的按需加载器和 PerlIO::* 命名空间的根
编码层
内存映射 IO
内存中 IO,标量 IO
Perl 中实现的 PerlIO 层的辅助类
用于 Quoted-Printable 字符串的 PerlIO 层
检查 Pod 文档是否存在语法错误
用于解析 Pod E<...> 序列
按 perlfunc.pod 的方式对 Perl 函数进行分组
将 Pod 文件转换为 HTML 的模块
Pod-Html 的辅助函数
将 POD 数据转换为格式化的 *roff 输入
解析 POD 文本中的 L<> 格式化代码
查找 Pod 格式的 Perl 文档。
Pod::Perldoc 格式化程序的基础
Pod::Perldoc 的自定义选项解析器
使用 ANSI 颜色转义符渲染 Pod
让 Perldoc 检查 Pod 中的错误
让 Perldoc 将 Pod 渲染为手册页
让 Perldoc 将 Pod 转换为 nroff
让 Perldoc 将 Pod 渲染为 ... Pod!
让 Perldoc 将 Pod 渲染为 RTF
使用终端转义符渲染 Pod
让 Perldoc 将 Pod 渲染为纯文本
让 Perldoc 使用 Tk::Pod 渲染 Pod
让 Perldoc 将 Pod 渲染为 XML
解析 Pod 的框架
检查文档的 Pod 语法
将 Pod::Simple 设置为跟踪/调试模式
将 Pod 解析事件转储为文本
将 Pod 转换为 XML
将 Pod 转换为 HTML
将多个 Pod 文件转换为多个 HTML 文件
只保留 Pod,完整的 Pod,并且只有 Pod
表示 L 代码的“section”属性
将 Pod::Simple 事件转换为方法调用
解析 Pod 的拉取解析器接口
来自 Pod::Simple::PullParser 的结束标记
来自 Pod::Simple::PullParser 的开始标记
来自 Pod::Simple::PullParser 的文本标记
来自 Pod::Simple::PullParser 的标记
将 Pod 格式化为 RTF
在目录树中查找 POD 文档
将 Pod 解析为简单的解析树
将格式化程序编写为 Pod::Simple 子类
将 Pod 格式化为纯文本
获取 Pod 的文本内容
将 Pod 格式化为验证 XHTML
将 Pod 转换为 XML
将 POD 数据转换为格式化文本
将 POD 数据转换为格式化的彩色 ASCII 文本
将 POD 数据转换为格式化的删除线文本
将 POD 数据转换为带有格式转义的 ASCII 文本
提取 POD 文档并显示使用信息
对 sdbm 文件的绑定访问
在受限的隔室中编译和执行代码
一系列通用的标量子程序
查找 - 在字典文件中搜索键
保存和恢复选定的文件句柄
仅按需加载函数
Perl 数据结构的持久性
一系列用于子程序和 CODE 引用 的实用子程序
操作 Perl 符号及其名称
尝试所有可行的方法获取主机名
Perl 对 UNIX syslog(3) 调用的接口
Sys::Syslog 的 Win32 支持
提供 TAP::Parser 的通用功能的基类
用于测试程序输出委托的基类
使用颜色运行 Perl 测试脚本
用于默认控制台输出的测试程序输出委托
用于并行控制台输出的测试程序输出委托
用于默认控制台输出的测试程序输出委托
用于文件输出的测试结果委托
用于文件输出的测试结果委托
测试结果委托的抽象基类
运行测试脚本并统计结果
解析与测试运行相关的环境变量
所有 TAP::*
模块的基类,提供通用功能
解析 TAP 输出
聚合 TAP::Parser 结果
测试任何协议的语法
TAP 源迭代器的基类
基于数组的 TAP 源迭代器
基于进程的 TAP 源迭代器
基于文件句柄的 TAP 源迭代器
确定为给定源使用哪个 SourceHandler 对象
多路复用多个 TAP::Parsers
TAP::Parser 输出对象的基类
退出结果标记
注释结果标记
计划结果标记
TAP 编译指示标记
测试结果标记
未知结果标记
TAP 语法版本标记。
YAML 结果标记。
用于创建 TAP::Parser 输出对象的工厂。
在并行测试期间调度测试。
单个测试作业。
一个空操作作业。
TAP 源代码及其元数据。
不同 TAP 源处理程序的基类。
从可执行 TAP 源流式传输输出。
从文本文件流式传输 TAP。
从 IO::Handle 或 GLOB 流式传输 TAP。
从 Perl 可执行文件流式传输 TAP。
从标量/数组引用中的原始 TAP 流式传输输出。
从迭代器读取 YAMLish 数据。
写入 YAMLish 数据。
使用 ANSI 转义序列为屏幕输出着色。
Perl termcap 接口。
Perl 单词补全模块。
Perl 与各种 readline
包的接口。
提供一个用于编写测试脚本的简单框架。
用于编写协同工作的测试工具的框架。
用于编写基于 Test2 的测试工具的主要接口。
哪些版本会发生故障
表示测试上下文的对象。
Test2::API 内部使用的对象
事件列表的表示。
用于表示事件
InterceptResult 使用的中心。
对算法的封装
用于管理 Test2::Hub 栈的对象
事件的基类
退出!
Diag 事件类型
设置输出流的编码
异常事件
简单失败断言的事件
通用事件类型。
注意事件类型
Ok 事件类型
简单通过断言的事件
计划的事件
跳过事件类型
子测试类型的事件
TAP 版本的事件。
第二代事件。
告诉所有进程/线程,现在该结束了。
所有事件面的基类。
包含事件详细信息的面。
断言赦免的面。
代表断言的面。
用于中心操作和行为的面。
用于需要显示的错误的面。
用于事件经过的中心的的面。
用于开发人员可能关心的信息的面。
表格的中间表示。
用于元数据的的面。
用于包含其他事件的事件的面。
用于设置计划的面。
用于指示如何渲染事件的面。
用于事件的调试信息。
用于格式化程序的命名空间。
标准 TAP 格式化程序。
所有事件流经的管道。
拦截器用来获取结果的中心。
由
子测试使用的集线器
打开 IPC 以支持线程或分叉。
Test2 IPC 驱动程序的基类。
临时目录 + 文件并发模型。
对于无法使用的小工具集
升级到 Test2 时的过渡说明
Test2 及其朋友使用的工具。
允许第三方工具安全地附加元数据
将方面数据转换为旧版事件 API。
构建基于哈希的类。
用于 Test2::EventFacet::Trace 的旧版包装器。
用于构建测试库的后端
Test::Builder 的 Test2::Formatter::TAP 子类
Test::Builder 的 IO::Scalar 副本
测试模块的基类
使用构建的测试套件
在 Test::Builder::Tester 中打开颜色
Test::Builder 的 Test2::Event::Diag 子类
使用统计信息运行 Perl 标准测试脚本
超越 make test
另一个用于编写测试脚本的框架
用于编写测试的基本实用程序。
简化使用 Test::Builder 构建的测试模块的测试
帮助测试使用 Test::Builder 构建的测试模块
帮助测试使用 Test::Builder 构建的测试模块
关于编写非常基础的测试的教程
Test::More::use_ok 的替代方案
Abbrev - 从列表中创建缩写表
从字符串中提取分隔的文本序列。
将文本解析为令牌数组或数组数组
像 unix expand(1) 和 unexpand(1) 一样展开和收缩制表符
换行以形成简单的段落
在 Perl 中操作线程(仅适用于旧代码)
线程安全的队列
线程安全的信号量
绑定数组的基类
通过 Perl 数组访问磁盘文件中的行
绑定句柄的基类定义
绑定哈希的基类定义
命名正则表达式捕获缓冲区
在需要时将数据添加到哈希中
使用引用作为哈希键
绑定标量的基类定义
绑定句柄的基类定义
固定表大小、固定键长度哈希
高分辨率闹钟、睡眠、gettimeofday、间隔计时器
高效地从本地时间和 GMT 时间计算时间
面向对象的日期时间对象
一个简单的 API 用于将秒转换为其他日期值
Perl 内置 gmtime() 函数的按名称接口
Perl 内置 localtime() 函数的按名称接口
Time::gmtime 和 Time::localtime 使用的内部对象
所有类(祝福引用)的基类
Unicode 排序算法
加权 CJK 统一表意文字
加权 CJK 统一表意文字
为 Unicode::Collate 加权 JIS KANJI
加权 CJK 统一表意文字
加权 CJK 统一表意文字
加权 CJK 统一表意文字
加权 CJK 统一表意文字
通过 Unicode::Collate 对 DUCET 进行语言定制
Unicode 规范化形式
Unicode 字符数据库
Perl 内置 getgr*() 函数的按名称接口
Perl 内置 getpw*() 函数的按名称接口
用于操作 DCL 符号的 Perl 扩展
在 VMS 和 Unix 文件规范语法之间转换
通过 VMS 扩展实现标准 I/O 函数
一些 Win32 API 函数的接口
用于文件/目录的 Win32 系统 API 调用低级访问。
Win32 CORE 函数存根
测试 perl C API
用于测试与 perl 一起分发的 XS 类型映射的模块
将 C 库动态加载到 Perl 代码中
用于在作用域结束时调用子例程的包装类
用于通过 %^H 管理作用域的钩子堆栈
autodie 和 Fatal 的内部实用程序子例程
用于版本对象的 Perl 扩展
要找出系统上安装的所有模块,包括那些没有文档或不在标准发行版中的模块,只需使用以下命令(在默认的 win32 shell 中,应使用双引号而不是单引号)。
% perl -MFile::Find=find -MFile::Spec::Functions -Tlwe \
'find { wanted => sub { print canonpath $_ if /\.pm\z/ },
no_chdir => 1 }, @INC'
(-T 用于防止 @INC 被 PERL5LIB
、PERLLIB
和 PERL_USE_UNSAFE_INC
填充。)它们都应该有自己的文档安装并可以通过您的系统 man(1) 命令访问。如果您没有find程序,您可以使用 Perl find2perl程序,它会生成可以运行的 Perl 代码作为输出。如果您有man程序,但它找不到您的模块,您需要修复您的 manpath。有关详细信息,请参阅perl。如果您没有系统man命令,您可以尝试使用perldoc程序。
还要注意,命令 perldoc perllocal
会为您提供已在您的系统上进一步安装的模块的(可能不完整的)列表。(perllocal.pod 文件由标准 MakeMaker 安装过程更新。)
扩展模块是用 C(或 Perl 和 C 的混合)编写的。它们通常在您需要时动态加载到 Perl 中,但也可以静态链接。支持的扩展模块包括 Socket、Fcntl 和 POSIX。
许多流行的 C 扩展模块没有捆绑(至少,没有完全捆绑),因为它们的大小、易变性,或者仅仅是因为没有足够的时间在 Perl 进行 beta 测试的众多平台上进行充分的测试和配置。我们鼓励您在 CPAN(如下所述)上或使用 Google 或 DuckDuckGo 等网络搜索引擎查找它们。
CPAN 代表 Comprehensive Perl Archive Network(Perl 综合档案网络);它是一个全球复制的 Perl 资源库,包含文档、风格指南、技巧和陷阱、非 Unix 系统的备用端口以及这些端口的偶尔二进制发行版。CPAN 的搜索引擎可在 https://www.cpan.org/ 找到。
最重要的是,CPAN 包含大约一千个未捆绑的模块,其中一些需要 C 编译器才能构建。主要模块类别包括:
语言扩展和文档工具
开发支持
操作系统接口
网络、设备控制(调制解调器)和进程间通信
数据类型和数据类型实用程序
数据库接口
用户界面
其他编程语言的接口/模拟
文件名、文件系统和文件锁定(另请参见文件句柄)
字符串处理、语言文本处理、解析和搜索
选项、参数、参数和配置文件处理
国际化和区域设置
身份验证、安全和加密
万维网、HTML、HTTP、CGI、MIME
服务器和守护进程实用程序
归档和压缩
图像、像素图和位图操作、绘图和图形
邮件和 Usenet 新闻
控制流实用程序(回调和异常等)
文件句柄和输入/输出流实用程序
其他模块
您可以在 https://www.cpan.org/ 在线找到 CPAN。
(以下部分直接摘自 Tim Bunce 的模块文件,可在您最近的 CPAN 站点找到。)
Perl 使用包来实现类,但包的存在并不意味着类的存在。包只是一个命名空间。类是一个提供可作为方法使用的子例程的包。方法只是一个子例程,它期望其第一个参数是包的名称(对于“静态”方法),或对某个东西的引用(对于“虚拟”方法)。
模块是一个文件,它(按照惯例)提供一个与文件名相同的类(去掉 .pm 后缀),以及该类中可以调用的用于获取导出符号的导入方法。该模块可能通过加载动态 C 或 C++ 对象来实现其某些方法,但这对模块用户来说应该是完全透明的。同样,该模块可能会设置一个 AUTOLOAD 函数,以便按需加载子程序定义,但这也是透明的。只需要存在 .pm 文件。有关 AUTOLOAD 机制的详细信息,请参阅 perlsub、perlobj 和 AutoLoader。
是否已经存在类似的模块?
如果是,请尝试以整体或继承有用功能到新类的方式重用现有模块。如果这不可行,请尝试与模块作者一起扩展或增强现有模块的功能。一个完美的例子是 perl4 中用于处理命令行选项的大量包。
如果您正在编写一个模块来扩展现有的模块集,请与该包的作者协调。如果您遵循与原始作者相同的命名方案和模块交互方案,将会有所帮助。
尝试设计新的模块,使其易于扩展和重用。
尝试使用 use warnings;
(或 use warnings qw(...);
)。请记住,您可以将 no warnings qw(...);
添加到需要较少警告的代码块中。
使用祝福引用。使用 bless 的两个参数形式,将祝福到构造函数的第一个参数中给出的类名,例如:
sub new {
my $class = shift;
return bless {}, $class;
}
或者,如果您希望它用作静态方法或虚拟方法,则可以使用:
sub new {
my $self = shift;
my $class = ref($self) || $self;
return bless {}, $class;
}
将数组作为引用传递,以便以后可以添加更多参数(它也更快)。在适当的情况下将函数转换为方法。将大型方法拆分为更小、更灵活的方法。如果合适,从其他模块继承方法。
避免使用类名测试,例如:die "Invalid" unless ref $ref eq 'FOO'
。通常,您可以删除 eq 'FOO'
部分而不会造成任何损害。让对象自行处理!通常,尽可能避免硬编码类名。
避免使用 $r->Class::func()
,而使用 @ISA=qw(... Class ...)
和 $r->func()
。
使用 autosplit,这样很少使用或新添加的函数就不会成为不使用它们的程序的负担。在 __END__ 之后将测试函数添加到模块中,可以使用 AutoSplit 或通过以下方式:
eval join('',<main::DATA>) || die $@ unless caller();
您的模块是否通过了“空子类”测试?如果您说 @SUBCLASS::ISA = qw(YOURCLASS);
,您的应用程序应该能够以与 YOURCLASS 完全相同的方式使用 SUBCLASS。例如,如果您将 $obj = YOURCLASS->new();
更改为 $obj = SUBCLASS->new();
,您的应用程序是否仍然可以工作?
避免在你的包中保存任何状态信息。这会让其他多个包难以使用你的包。将状态信息保存在对象中。
始终使用-w。
尝试使用use strict;
(或use strict qw(...);
)。请记住,你可以添加no strict qw(...);
到需要更少严格性的代码块。
始终使用-w。
遵循perlstyle中的指南。
始终使用-w。
一些简单的风格指南
Perl 附带的 perlstyle 手册包含许多有用的要点。
编码风格是个人喜好问题。许多人在多年学习中逐渐形成自己的风格,因为他们了解到什么有助于他们编写和维护良好的代码。以下是一组经验丰富的开发人员广泛使用的建议。
使用下划线分隔单词。通常情况下,阅读 $var_names_like_this 比 $VarNamesLikeThis 更容易,特别是对于非英语母语人士。这也是一个简单且适用于 VAR_NAMES_LIKE_THIS 的规则。
包/模块名称是此规则的例外。Perl 非正式地将小写模块名称保留给像 integer 和 strict 这样的“pragma”模块。其他模块通常以大写字母开头,使用混合大小写且没有下划线(需要简短且可移植)。
你可能会发现使用字母大小写来指示变量的作用域或性质很有帮助。例如
$ALL_CAPS_HERE constants only (beware clashes with Perl vars)
$Some_Caps_Here package-wide global/static
$no_caps_here function scope my() or local() variables
函数和方法名称似乎最适合使用全小写。例如,$obj->as_string()
。
你可以使用前导下划线来指示变量或函数不应在定义它的包之外使用。
选择要导出的内容。
不要导出方法名称!
如果没有充分的理由,不要默认导出其他任何内容!
导出会污染模块用户的命名空间。如果你必须导出,尝试使用 @EXPORT_OK 而不是 @EXPORT,并避免使用短的或常见的名称,以减少命名冲突的风险。
通常情况下,任何未导出的内容仍然可以通过 ModuleName::item_name(或 $blessed_ref->method
)语法从模块外部访问。按照惯例,你可以在名称上使用前导下划线来非正式地指示它们是“内部的”,不供公共使用。
(实际上,可以通过以下方式获取私有函数:my $subref = sub { ... }; &$subref;
。但是,无法直接将其作为方法调用,因为方法必须在符号表中具有名称。)
一般来说,如果模块试图面向对象,则不导出任何内容。如果它只是一个函数集合,则可以使用 @EXPORT_OK 导出任何内容,但要谨慎使用 @EXPORT。
为模块选择一个名称。
此名称应尽可能描述性、准确和完整。避免任何歧义的风险。始终尝试使用两个或多个完整的单词。通常,名称应反映模块的特殊之处,而不是它如何实现。请使用嵌套模块名称来非正式地分组或对模块进行分类。模块没有嵌套名称应该有充分的理由。模块名称应以大写字母开头。
拥有 57 个名为 Sort 的模块不会让任何人感到轻松(尽管拥有 23 个名为 Sort::Quick 的模块只是稍微好一点 :-)。想象一下,有人试图将你的模块与许多其他模块一起安装。
如果你正在开发一套相关的模块/类,最好使用具有公共前缀的嵌套类,因为这将避免命名空间冲突。例如:Xyz::Control、Xyz::View、Xyz::Model 等。使用此列表中的模块作为命名指南。
如果向一组模块添加新模块,请遵循原始作者为模块命名以及这些模块中方法接口的标准。
如果开发用于私有内部或项目特定用途的模块,这些模块永远不会发布到公众,那么你应该确保它们的名称不会与任何未来的公共模块冲突。你可以通过使用保留的 Local::* 类别或使用包含下划线的类别名称(如 Foo_Corp::*)来做到这一点。
为了便携性,模块名称的每个组件都应限制为 11 个字符。如果它可能在 MS-DOS 上使用,请尝试确保每个组件的前 8 个字符都是唯一的。嵌套模块使这更容易。
有关模块命名的更多指导,请参阅
https://pause.perl.org/pause/query?ACTION=pause_namingmodules
或发送邮件到 <[email protected]> 邮件列表。
你是否正确理解了?
你怎么知道你做出了正确的决定?你是否选择了会导致以后出现问题的界面设计?你是否选择了最合适的名称?你还有其他问题吗?
最好的方法是向了解的人询问,并获得许多有用的建议。<[email protected]> 邮件列表非常适合此目的;您也可以通过新闻界面访问它,地址为 nntp.perl.org 上的 perl.module-authors。
您只需发布模块的简短摘要,包括其目的和接口。每个主要方法的几行就足够了。(如果您发布整个模块,可能会被忙碌的人忽略 - 通常是您希望阅读它的人!)
如果您不能确定模块何时准备就绪,请不要担心发布 - 只需在消息中说明即可。也许可以邀请其他人帮助您,他们可能能够为您完成它!
README 和其他附加文件。
众所周知,软件开发人员通常会完整地记录他们编写的软件。但是,如果世界迫切需要您的软件,而没有足够的时间编写完整的文档,请至少提供一个包含以下内容的 README 文件:
模块/包/扩展等的描述。
版权声明 - 请参见下文。
先决条件 - 您可能还需要什么。
如何构建它 - 可能对 Makefile.PL 等进行的更改。
如何安装它。
此版本中的最新更改,尤其是兼容性问题。
您计划在未来进行的更改/增强。
如果 README 文件似乎变得太大,您可能希望将某些部分拆分为单独的文件:INSTALL、Copying、ToDo 等。
添加版权声明。
您选择如何许可您的作品是一个个人决定。一般机制是声明您的版权,然后声明其他人如何复制/使用/修改您的作品。
例如,Perl 附带两种类型的许可证:GNU GPL 和 Artistic 许可证(请参见文件 README、Copying 和 Artistic,或 perlgpl 和 perlartistic)。Larry 有充分的理由不只使用 GNU GPL。
出于对 Larry、Perl 和整个 Perl 社区的尊重,我个人建议简单地说
Copyright (c) 1995 Your Name. All rights reserved.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
此声明至少应出现在 README 文件中。您可能还想将其包含在 Copying 文件和源文件中。请记住除了版权之外还要包含其他词语。
为模块提供版本/问题/发布号。
为了与 Exporter 和 MakeMaker 模块完全兼容,您应该将模块的版本号存储在一个非 my 包变量中,名为 $VERSION。这应该是一个正浮点数,小数点后至少两位(即百分之一,例如,$VERSION = "0.01"
)。不要使用“1.3.2”样式的版本。有关详细信息,请参阅 Exporter。
添加一个函数或方法来检索该数字可能很方便。在发布模块时(ModuleName-1.02.tar.Z),在公告和存档文件名中使用该数字。有关详细信息,请参阅 perldoc ExtUtils::MakeMaker.pm。
如何发布和分发模块。
如果可能,请在 CPAN 上注册模块。请遵循以下说明和链接
https://www.cpan.org/modules/04pause.html
并上传到
https://pause.perl.org/
并通知 <[email protected]>。这将允许任何人使用 Perl 附带的 cpan
工具安装您的模块。
通过使用 WWW 界面,您可以要求上传服务器将您的模块从您的 ftp 或 WWW 站点镜像到您在 CPAN 上的目录中!
更改已发布的模块时要小心。
始终努力保持与以前发布的版本的兼容性。否则,尝试添加一个机制来恢复到旧的行为,如果人们依赖它。记录不兼容的更改。
没有转换任何内容的要求。
如果它没有坏,就不要修理它!Perl 4 库脚本应该继续工作,没有任何问题。您可能需要进行一些小的更改(例如,在双引号字符串中转义非数组 @),但没有必要将 .pl 文件转换为模块,仅仅是为了这个目的。
考虑一下影响。
如果将脚本转换为模块,所有使用该脚本的 Perl 应用程序都需要进行(轻微)更改。除非您计划同时进行其他更改,否则这样做值得吗?
充分利用这个机会。
如果你打算将脚本转换为模块,你可以利用这个机会重新设计界面。上面关于模块创建的指南包含了你应该考虑的许多问题。
pl2pm 实用程序将帮助你开始。
此实用程序将读取 *.pl 文件(作为参数给出)并写入相应的 *.pm 文件。pl2pm 实用程序执行以下操作
添加标准的模块序言行
将包说明符从 ' 转换为 :
将 die(...) 转换为 croak(...)
其他一些细微的更改
作为一个机械过程,pl2pm 并非万无一失。转换后的代码需要仔细检查,尤其是任何包语句。在新的 .pm 文件正常工作之前,不要删除原始的 .pl 文件!
完整的应用程序很少属于 Perl 模块库。
许多应用程序包含一些可以重用的 Perl 代码。
帮助拯救世界!以易于重用的形式分享你的代码。
将可重用的代码分解成一个或多个单独的模块文件。
借此机会重新考虑和重新设计接口。
在某些情况下,“应用程序”可以简化为一小段
建立在可重用模块之上的代码片段。在这些情况下,应用程序可以调用为
% perl -e 'use Module::Name; method(@ARGV)' ...
or
% perl -mModule::Name ... (in perl5.002 or higher)
Perl 不会像你在其他语言(如 C++、Ada 或 Modula-17)中习惯的那样强制执行其模块的私有和公共部分。Perl 对强制隐私没有迷恋。它更希望你因为没有被邀请而待在它的客厅之外,而不是因为它有一把猎枪。
模块及其用户之间有一份契约,其中一部分是习惯法,一部分是“书面”的。习惯法契约的一部分是模块不会污染任何它没有被要求污染的命名空间。模块的书面契约(又称文档)可能会做出其他规定。但当你use RedefineTheWorld
时,你就知道你在重新定义世界,并愿意承担后果。