Perl 21:把日志解析搬进模块,不等于导出所有名字
此前 CLI 直接执行 LogTool::read_records 等过程。模块文件位于 examples/perl-language/lib/LogTool.pm,包名为 LogTool,函数是包里的名字;在调用者写 use LogTool ... 时,装载模块和把名字导入调用者的命名空间又是两步。把“能装载文件”误解为“任意函数都会自动出现”,会让调用代码依赖不透明的导出习惯。
当前模块用 strict、warnings,设 $LogTool::VERSION = '0.100',只在 @EXPORT_OK 列出 read_records、format_record、report、report_rows。bin/logtool.pl 通过 FindBin 指向自己的 ../lib 再显式导入这四个函数。测试先调用 report_rows([]),得到结构明确的 [['TOTAL', 0]];反例执行 perl -Iexamples/perl-language/lib -e 'use LogTool qw(not_exported);',STDOUT 空,STDERR 指明该名字 is not exported,退出码 255。这是导入合同失败,不是解析一条空日志的失败。
图:模块加载路径与显式导出
1 | |
练习:把 @EXPORT_OK 清空但保留 package LogTool;,CLI 会在什么时候发现问题?use LogTool qw(read_records ...) 导入阶段就应失败,不能把它当作文件解析错误;从未通过的 CLI 也不能输出导入计数。完整命令、错误流及测试结果在 examples/perl-language/evidence/21-25.md。参考 Perl 5.38.2 官方 pod/perlmod.pod(Perl Modules、Packages)和当前核心 Exporter 5.77;不把包变量与词法变量混为一谈。









