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

时间:2016-02-08 12:55:02

标签: perl oop hashref

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

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

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

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

中的dbic对象中的值

我尝试使用:

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

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

我正在努力实现的目标是什么?

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:3)

实现此目的的一种方法是使用“由内而外的对象”,其中对象只是一个有福的简单标量,并且数据是分开存储的。 例如,请参阅Class::STD