报表在 14 已有确定顺序的 TSV。要给接收 CSV 的程序另一种表示,需要的是正确处理引号和逗号的编码器,不能简单把制表符换成逗号。这里为同一 CLI 加 report-csv,但不让安装实验破坏系统 Perl 的模块集合。

Text-CSV-2.06.tar.gz 由 CPAN 发布目录下载;发布者 CHECKSUMS 对该文件的 SHA-256 是 dfcaec925a788b0ba41e51bc6d16e21b0e98b4c7af9b79395090add75f5e506f,本机下载值相同。先验证系统中 perl -MText::CSV 找不到模块,再在临时源码目录运行 perl Makefile.PL INSTALL_BASE=.../examples/perl-language/vendor、make test、make install。实际安装的 Text::CSV 和内附 Text::CSV_PP 都为 2.06;vendor/Text-CSV-2.06.tar.gz 保留上游元数据与许可证说明,安装后的两个模块也随实验包交付。没有往 /usr 安装依赖。

META.json 的运行必需项是 Perl、IO::Handle、Test::More、Test::Harness;构建/配置需要 ExtUtils::MakeMaker,可选推荐 Text::CSV_XS >= 1.60。本机推荐 XS 不存在,CLI 的 CSV 分支还显式设定使用 PP,避免机器上装有 XS 时默默换后端。make test 给出 40 个文件、52,723 个通过断言;由于缺少可选 Test::Pod 1.00,其中一项 POD 测试被跳过,并有负例产生的 # CSV_PP ERROR 诊断。不能写成“所有上游测试无条件通过”。

本 CLI 运行 report-csv fixtures/demo.tsv 的 STDOUT 是 TOTAL,3、INFO,2、WARN,1 三行,和 golden/report-csv.txt 一致,STDERR 空、退出码 0。直接调用 CSV 库对含逗号的标签 api,worker 输出 "api,worker",2,验证不是手工拼接;输入 invalid.tsv 的整份 CSV 报表依旧被拒绝、退出码 2 且 STDOUT 空。它仍只写 STDOUT,不提供目标文件落盘的原子性。练习:删掉 vendor/,在无网络的解包目录为何不应宣称 report-csv 可复跑?库不在系统路径;必须连同隔离安装产物和发行包一起交付。完整依赖、命令、原始测试流和来源在 examples/perl-language/VERSIONS.md、examples/perl-language/evidence/21-25.md、CPAN 发布目录;Perl 模块机制见官方 5.38.2 pod/perlmod.pod。

后续依赖复核把同一主题分成两条证据链:vendor/lib/perl5 中的 Text::CSV_PP 2.06 继续证明纯 Perl 后端可复跑;vendor/dist/Text-CSV_XS-1.64.tgz 另存 CPAN 源码,SHA-256 为 65c5662d4fe8ef3039a1b32f641634d0aae6ab10eabbb24f740c75332f2caf30,在 Perl v5.38.2 隔离前缀下编译为 XS 后端。t/course-dependencies.t 同时解析含换行和转义双引号的记录,并用 PERL_TEXT_CSV=Text::CSV_PP 另跑 PP;两个后端字段结果一致,但后端身份必须分别记录,不能用 XS 通过替代 PP,也不能用 PP 通过推断 XS 已编译。