Perl E05:能加载 CSV 不说明它从哪里来
第 23 篇隔离安装 Text::CSV,37 篇又把它写进发行元数据。复核时须区分源码包、安装路径、被实际加载的版本和执行后端:上游 Text-CSV-2.06.tar.gz 的 SHA-256 dfcaec925a788b0ba41e51bc6d16e21b0e98b4c7af9b79395090add75f5e506f 与官方 CHECKSUMS 核对过;本仓库 vendor/lib/perl5 中加载到 Text::CSV 2.06 和 Text::CSV_PP 后端。正例 STDOUT 2.06 Text::CSV_PP\n、STDERR 空、退出 0。
反例用同一隔离路径要求 use Text::CSV 999;,STDOUT 空,STDERR 明确说 required version 999,退出非零。它验证版本约束确实可触发,并不代替缺失模块与编译环境的独立测试。VERSIONS.md 逐项列出发行 META 中的直接依赖、实际基础环境的核心模块版本、缺少推荐 XS 后端的事实,以及上游 52,723 项测试里可选 Test::Pod 被跳过;不能简化成“依赖都内置”或“上游全测完成”。
练习:如果本机装上 Text::CSV_XS 而代码依然只写 use Text::CSV,后端一定与本实验一致吗?不一定;CLI 在 report-csv 路径显式选择 PP,复核还要检查实际 backend,而不是只读 VERSION。完整命令与反例见 examples/perl-language/evidence/E01-E08.md;发行源/校验/安装见 examples/perl-language/VERSIONS.md。
新依赖复核扩展到 XS、数据库和对象系统:DBI-1.655.tgz、DBD-SQLite-1.78.tar.gz、Moo-2.005005.tar.gz 及其 Role::Tiny、Class::Method::Modifiers、Sub::Quote 依赖都在 vendor/dist/ 固定 SHA-256。首次 DBI 全量上游批次在 t/zvxgn_85gofer.t 第 138 个断言失败;同一构建目录随后单文件复跑 234 项通过,完整 DBI 216 文件、9690 项复跑通过。Text::CSV_XS 首次上游批次有两个文件被信号 9 杀掉;随后单文件和完整 35 文件、52610 项复跑通过。课程自身只按这些复跑证据声明可用,不抹掉首次失败记录。
Moo 不是只写一个 has 的薄包装。LogTool::Course::Role::LevelRows 用 Moo::Role 提供 level 校验与排序行协议,LogTool::Course::MooAggregator 通过 with 组合该角色;TAP 同时比较传统 LogTool::Course::Aggregator 与 Moo 聚合器的 new/add/rows 行为。另一个 class/bless 实验保留 Perl 5.38 class 的 experimental warning:blessed hash 与 class 对象可以通过共同的 level 方法协议参与聚合,但 class 对象不能按传统 hash 直接解引用。









