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

Kyl*_*yle 1 oop perl hashref

我有一个基于祝福hashref的Perl类(https://github.com/kylemhall/Koha/blob/master/Koha/Object.pm)

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

我看到的是一些开发人员不小心使用我们的对象作为hashrefs.实际数据不存储在祝福的hashref中,而是存储在hashref中的dbic对象中(在$ self - > {_ result}中).当开发人员尝试像$ object这样的东西时 - > {id} perl不会抱怨,它只会返回undef,正如预期的那样.

我想要做的是A)当发生这种情况时让脚本爆炸并出现错误B)允许使用hashref语法来设置/获取存储在$ self中的dbic对象中的值 - > {_ result}

我试过用:

use overload '%{}' => \&get_hashref;
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,每次调用常规方法时都会调用get_hashref!这在某种程度上是有道理的,因为对象本身是一个hashref.我确信这与Perl内部有关,可以将祝福的hashref作为对象.

我正在努力实现甚至可能吗?

ike*_*ami 5

我建议使用基于标量或基于数组的对象而不是基于散列的对象.这是一种廉价(高效)的解决方案,因为它只会导致犯罪者违反现有的类型检查.

例如,以下生成的对象只是对实际对象的引用.只需使用$$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.
Run Code Online (Sandbox Code Playgroud)