Perl 原定 E08:遗留代码迁移先守住行为
遗留 Perl 常见问题不是语法旧,而是依赖藏得太深:全局路径、全局文件句柄、二参数 open、隐式 $_ 都会让调用者难以判断输入从哪里来、输出写到哪里去。迁移的第一步不是重写成新风格,而是先写出旧行为的最小回归,再把隐式依赖改成显式参数。
累计实验 examples/perl-language/experiments/course-legacy.pl 先保留一个小的 legacy 计数器:它读取全局 $CURRENT_PATH,使用全局 FH 和二参数 open,统计一行输入。迁移版本改成 migrated_count($file),使用三参数 open my $fh, '<', $file 和词法文件句柄。TAP 断言旧版计数和新版计数都是 1,同时断言三项迁移事实:全局路径由参数替代,二参数 open 由三参数 open 替代,全局文件句柄由词法文件句柄替代。
1 | |
反例是一次性改写所有东西。若同时改解析规则、输出格式、文件打开方式和异常处理,测试失败时很难知道是哪一层改变了行为。本篇的样本很小,只证明迁移手法和回归对照;它不承诺能自动迁移任意旧脚本,也不把 local (*FH, $_) 这种隔离演示推荐为新代码写法。
来源固定在 Perl 5.38.2 perlfunc 的 open 文档、perlopentut 和 perldata 对 typeglob/文件句柄的背景说明,对外链接可查 https://perldoc.perl.org/5.38.2/functions/open 与 https://perldoc.perl.org/5.38.2/perlopentut。练习:为什么不直接删除旧函数,只留下新函数?答案是没有旧函数的对照,就无法证明迁移前后的行为相同。应先用旧函数锁住样本行为,再删旧实现;删除发生在回归证据之后。







