Perl E01:signatures 的稳定状态不等于任意参数都可收
第 07 篇展示了普通子例程的 @_ 参数别名。这里换一种入口做对照,而不改日志 CLI 主线:在冻结的 Perl 5.38.2 下,use feature 'signatures' 可在词法范围内启用签名。官方 pod/perlexperiment.pod 记载 signatures 从 5.20 引入、5.36 被接受;签名本身在此版本不应被一律当成实验功能并压制警告。
1 | |
本机正例 STDOUT INFO\n、STDERR 0 字节、退出 0;反例 level() 报 Too few arguments for subroutine、STDOUT 空、退出非零。签名将参数显式绑定到词法变量,并为个数提供检查;它并没有使字符串自动符合 INFO/WARN/ERROR 的业务规则,也没有改变 report_rows 返回的是数组引用这一契约。与 @_ 的别名陷阱对照,不能把“签名会校验数量”误写成“签名可以取代所有输入校验”。
补充对照来自课程过滤器:make_filter 仍使用传统 @_ 接收 %conditions,随后把 level、contains、min_duration_ms 复制到词法变量;签名版本若写成 sub make_filter(%conditions),也只是把参数绑定写得更清楚,不会自动禁止未知键、不会深拷贝引用,也不会判断 contains 应当是字面包含还是正则。当前过滤器显式校验等级和耗时,用 index 实现字面包含;CLI 的选项白名单负责拒绝未知参数,不能从函数参数语法推导这条保证。测试再断言非法等级抛错、点号按字面值匹配。
因此 signatures 的教学位置是“参数绑定语法”,不是“业务校验框架”。冻结 5.38.2 下 signatures 已被接受;若用 5.34 对照运行,仍要显式 use feature 'signatures',并按该版本文档处理 experimental warning。class 与 signatures 不是同一种状态:5.38.2 的 class 仍属实验特性,不能因为二者都经 feature 启用就写成同一稳定级别。换解释器时先看 feature、perlsub 和 perlexperiment,再看测试输出。
练习:删去 use feature 'signatures' 仍把 ($value) 写在 sub 后,在这份冻结环境里能否按相同规则运行?不应依赖隐式开启;用局部 feature 写清源码要求,换 Perl 版本还应核对发行文档。命令、金标与三通道在 examples/perl-language/evidence/E01-E08.md,官方参照 pod/perlsub.pod 与 pod/perlexperiment.pod。








