如何停止或允许将 perl 对象用作 hashref?

How can I stop or allow a perl object to be used as a hashref?

我有一个 Perl class,它基于受祝福的哈希引用 (https://github.com/kylemhall/Koha/blob/master/Koha/Object.pm)

这是一个基于社区的项目,拥有许多不同技能的开发人员。

我看到的是一些开发人员不小心将我们的对象用作哈希引用。实际数据不存储在 blessed hashref 中,而是存储在 hashref 中的 dbic 对象中(在 $self->{_result} 中)。当开发人员尝试 $object->{id} 之类的东西时,perl 不会抱怨,它只是 returns undef,正如预期的那样。

我想做的是 A)发生这种情况时,使脚本爆炸并出现错误 B) 允许使用 hashref 语法设置/获取存储在 $self->{_result}

中的 dbic 对象中的值

我尝试使用:

use overload '%{}' => \&get_hashref;

但是当我这样做时,只要调用常规方法,就会调用 get_hashref!这在某种程度上是有道理的,因为对象本身就是一个 hashref。我敢肯定这与 Perl 内部将受祝福的 hashrefs 作为对象有关。

我正在努力实现的目标是否可行?

我建议使用基于标量或基于数组的对象,而不是基于散列的对象。这是一种廉价(有效)的解决方案,因为它只会导致违规者 运行 与现有类型检查发生冲突。

例如,下面生成的对象只是对实际对象的引用。只需在方法中使用 $$self 而不是 $self

$ perl -e'
   sub new {
      my $class = shift;
      my $self = bless(\{}, $class);
      # $$self->{...} = ...;
      return $self;
   }
   my $o = __PACKAGE__->new();
   my $id = $o->{id};
'
Not a HASH reference at -e line 9.

一种方法是使用 "inside-out objects",其中对象只是一个受祝福的简单标量,数据是单独存储的。 例如,参见 Class::STD