Perl 原定 E07:SV、AV、HV 与 op tree 只能作诊断证据
Perl 代码里的标量、数组引用和哈希引用,在解释器内部分别会落到 SV、AV、HV 等结构;表达式会编译成 op tree。B 和 Devel::Peek 能把这些诊断信息打印出来,但它们不是跨版本 API。课程可以用它们解释“为什么引用只是指向内部值的句柄”,不能把某一行 dump 当成业务契约。
累计实验 examples/perl-language/experiments/course-internals.pl 用 B::svref_2object 查看 INFO、[1,2]、{INFO=>2},得到 PV、AV、HV 一类名称;再用子进程执行 Devel::Peek::Dump 保存真实输出,检查其中含 PV 与 REFCNT。另一个子进程运行 B::Concise -exec 解释 my ($x, $y) = (1, 2); print $x + $y,证据文件保存完整 op tree。
1 | |
这段 B::Concise 输出只说明固定表达式里有两个整数常量、词法变量范围、加法 op 和打印 op。TAP 只断言出现 const 与 add,不把节点编号、flag 或顺序写成课程契约。Devel::Peek 的 REFCNT 也只属于当前进程、当前样本和当前观察点。
源码引用固定到本次审查使用的 Perl 5.38.2 源码提交:https://github.com/Perl/perl5/blob/55dd2f792ffc8cefe614350a411f785374281b24/sv.h、av.h、hv.h、op.h。它们分别给 SV、数组体、哈希体和 op 结构提供实现背景;正文只用这些链接解释概念边界,不要求读者记住本机地址或 refcount 数字。
反例是把内部 dump 当成稳定接口。不同编译选项、优化、平台和 Perl 小版本都可能改变 op 名称、顺序或 refcount 细节。练习:看到 REFCNT = 1,能否推出生产代码没有泄漏?答案是不能。要分析泄漏,需要长期运行、生命周期设计和专门工具;Devel::Peek 在这里只是把内部结构显影。









