ハッシュとしてもアクセスできるような気分になれるアレイのつくりかた

諸事情により Perl5 の機能を絞りつくすようなプログラムを最近かいていて、そんな中で、「あ、そういうのもありましたね」って気分になった機能をここに記す。

Perl5 は operator overload をサポートしているのだが、overload できるオペレーターの一つに '@{}' がある。

これはつまり、hash dereference をオーバーロードできるってこと。

package HashableArray {
    use overload (
    '%{}' => sub {
        my $self = shift;
        +{ map { $_ => $self->[$_] } keys @$self };
    },
    fallback => 1,
    );
    sub new {
        my $class = shift;
        bless [@_], $class;
    }
}

とすると、以下のようにアクセスできるー。

my $y = HashableArray->new(4,6,4,9);
say $y->{2}; # => 4
say $y->[2]; # => 4

ただ、実際これアクセスするときにコピーはしっちゃってるのが難点。 コピーを回避するには PP_check でがんばらないとだめそうね。

Published: 2013-10-09(Wed) 08:10