传统 bless 对象是 LogTool::Record 的主线选择;原因不是“新语法在 5.38.2 无法运行”,而是这版 class 尚属实验。use feature 'class' 的正例定义 field $level :param、method level,Event->new(level => 'INFO') 的 STDOUT 为 INFO\n、退出 0,同时 STDERR 如实报告 class is experimental、field is experimental、method is experimental。不要用关闭 warnings 把实验状态伪装成稳态。

1
2
3
4
5
use feature 'class';
class Event {
field $level :param;
method level { $level }
}

反例调用 Event->new() 缺少必需参数,仍出现三类实验提示,并额外报 Required parameter 'level' is missing、退出非零。与 bless { level => ... }, $class 比较:传统对象由 new 自己制定字段检查和复制策略,class 语法提供构造参数/词法字段语义,不是给原散列额外加一个编译器开关;本系列没有用它替换生产主线的 Record.pm。两种构造器都还需要明确领域规则,不能仅凭语法推断服务名、时间格式合法。

练习:为了让 CI“干净”,给 class 范例加 no warnings 'experimental::class' 可以吗?本系列不这么做:警告正是版本边界的证据。命令与完整三通道见 examples/perl-language/evidence/E01-E08.md;参考 5.38.2 pod/perlclass.pod、pod/perlexperiment.pod。

互操作实验把两种对象放到同一条协议上验证:传统 bless 记录公开 level 方法,class 记录也公开 level 方法;聚合器只调用方法或读取 hash 的 level 字段,因此两者都能贡献计数。边界也要写清楚:class 字段是词法字段,不能像 blessed hash 那样用 $obj->{level} 直接解引用;本次实验把这个访问判为 hash_rejected,同时保留 class/field/method experimental warning。共同方法协议可以互操作,内部表示不能互换。