CPAN 是 Perl 的模块仓库,二十多万个模块覆盖文本、数据库、网络、日期等所有方向。会用它的关键是知道常去哪几个货架,以及怎么判断一个模块值不值得依赖。
cpanm Text::CSV # 安装 cpanm --interactive . # 从本地目录装 cpanm --uninstall Text::CSV
cpanm Module::Name 装最新稳定版,依赖自动解决。装不上时九成是编译型模块缺 C 工具链——Windows 用 Strawberry Perl 自带,Linux 装好 build-essential 即可。
| 模块 | 干什么 | 什么时候选它 |
|---|---|---|
| Text::CSV | 严谨的 CSV 解析 | 字段含逗号引号时,别手写 split |
| DateTime | 日期时间运算 | 跨月统计、时区换算 |
| File::Find | 递归遍历目录 | 日志按目录树分布 |
| JSON | JSON 编解码 | 结果要给前端消费 |
| DBI | 数据库接口 | 第 8 章的主角 |
| Regexp::Common | 现成正则库 | IP、数字等通用模式 |
| Path::Tiny | 文件路径操作 | 嫌内建函数零散时 |
Regexp::Common 值得单独一看——IP 正则这种东西写对一次就够了,它提供经过检验的版本:
use Regexp::Common qw(net); if ($ip =~ /^$RE{net}{IPv4}$/) { print "合法 IPv4\n"; }
CPAN 上同名功能常有多个实现,挑的时候看三处:
cpanm --info Text::CSV # 看版本、作者、许可
⚠️ 常见坑:别在生产的系统 Perl 上随手 cpanm。装一份用户级 Perl 再装模块,升级系统时不至于把工具链连根拔走。
装好的模块清单要留档,否则换机器或接手者的第一句就是"缺依赖"。两个层次的做法:
# 轻量:导出当前环境的模块清单 cpanm --info Text::CSV > modules.txt # 逐个记录关键依赖 # 或直接扫描已装模块 perl -MModule::CoreList -e 'print join "\n", sort keys %Module::CoreList::version' # 正式:carton 锁定完整依赖树 carton install # 按 cpanfile 安装并生成 cpanfile.snapshot carton exec -- perl script.pl # 带锁定环境运行
cpanfile 声明"要什么",cpanfile.snapshot 记录"实际装了哪个版本",这对团队项目等于把环境写成了可重放的文档。哪怕团队不用 carton,至少把脚本直接 use 到的模块连同版本号写进 README 的依赖一节——五年后复现环境的人会感谢这一分钟的投资。
以 CSV 解析为例走一遍选型流程。需求:解析带引号逗号字段的导出文件,千万行级,输出统计。候选三个:手写 split(零依赖但引号字段必错)、Text::CSV(纯 Perl,稳)、Text::CSV_XS(C 实现,快约十倍)。判断顺序:先用 Text::CSV 写正确版本并配样本测试;量级上来后确认瓶颈确在解析(加计时验证而非感觉);再换 Text::CSV_XS——两者接口兼容,use Text::CSV 换成 Text::CSV_XS 一行搞定。这个"先正确、再测准瓶颈、后换快实现"的顺序不可颠倒,多数性能焦虑在第二步就被证明找错了地方。
CPAN 之外,随 Perl 发行的标准库本身就有一批值得记住的模块,它们零安装成本、永不缺依赖。文本方向有 Text::Wrap(按宽度折行,生成纯文本报告时排版利器)与 Text::Abbrev(命令缩写匹配,写 CLI 工具时"输入前几个字母即全称");时间方向有 Time::Piece(面向对象的日期对象,替代难用的 localtime 数组);结构方向有 Storable(把哈希直接持久化到文件,做简单的断点状态存取比 JSON 还省事);调试方向有 Devel::Peek(看变量的内部表示,理解字符串数值双表示的神器)。养成"动手装模块前先扫一眼标准库有没有"的习惯,脚本的部署成本会显著下降——每少一个外部依赖,就少一处"三年后装不上"的风险点。标准库清单可以用核心模块列表查询,把你常用方向的那几页通读一遍,是回报率极高的一小时投资。与之配套还有一个查证习惯:装任何新模块前先 perldoc 模块名 看文档是否齐全、示例是否能看懂——文档质量本身就是模块质量最便宜的预测指标,连文档都懒得写的作者,代码多半也懒得测。真拿不准时还有最后一招:直接读模块源码——CPAN 模块的 t/ 目录里躺着作者自己写的测试,测试覆盖了哪些边界、写得是否认真,五分钟浏览胜过十条二手评价,这也算把 6.2 节"代码、文档、测试三件配套"的标准反过来用在了选型上。养成看 t/ 目录的习惯还有个副产品:好的测试本身就是用法示例,比文档里的 SYNOPSIS 更详细——作者的测试怎么喂输入、期望什么输出,照着写自己的调用代码几乎不会走弯路。选型这件事的完整流程至此闭环:先查标准库、再挑 CPAN 候选、看文档与测试、小规模试用、最后锁定版本进 cpanfile——五步走完,一个依赖从"听说不错"变成"验证过可用",此后它就只是你工具墙上的一件顺手的旧工具。