1

祝福されたハッシュリファレンスに基づくPerlクラスがあります(https://github.com/kylemhall/Koha/blob/master/Koha/Object.pm

これはコミュニティ ベースのプロジェクトであり、さまざまなスキルを持つ多くの開発者が参加しています。

私が見たのは、私たちのオブジェクトを誤ってハッシュリファレンスとして使用している開発者がいることです。実際のデータは、blessed ハッシュリファレンスではなく、ハッシュリファレンス ( $self->{_result} 内) に格納されている dbic オブジェクトに格納されます。開発者が $object->{id} のようなことを試みると、perl は文句を言わず、期待どおり undef を返すだけです。

私がやりたいことは、A) これが発生したときにスクリプトがエラーで爆発するようにする B) $self->{_result} に格納されている dbic オブジェクトの値を設定/取得するための hashref 構文の使用を許可することです。

私は使用してみました:

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

しかし、これを行うと、通常のメソッドが呼び出されるたびに get_hashref が呼び出されます! オブジェクト自体がハッシュリファレンスであるため、これはある意味で理にかなっています。これは、bless された hashref をオブジェクトとして扱うための Perl の内部構造と関係があると確信しています。

私が達成しようとしていることは可能ですか?

4

2 に答える 2

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.
于 2016-02-08T13:06:22.190 に答える