デリファレンスのオーバーロード

Catalyst のぷらぎんかいてて overload もデリファレンスとかでつかうならいいかなとか思った。

普通の演算子のオーバーロードは C++ とかだとかっけーんだけど、Perl でやるとうまく使わない限りなんか微妙で好きじゃなかったんだけど。デリファレンスのそれは結構なかなかかも。

#!/usr/bin/perl

use strict;

package OverloadTest;

use overload (
    q{""} => sub { shift->{text} },
    '${}' => sub { shift->{scalar} },
    '@{}' => sub { shift->{array} },
    '&{}' => sub { shift->{function} },
);


sub new {
    my $self = bless {}, shift;

    $self->{text}     = 'fooooooooo';
    $self->{scalar}   = \'heh ;)';
    $self->{array}    = [qw/blah blah blahhh/];
    $self->{function} = sub { "bar!!!!" };

    $self;
}


package main;
use Data::Dumper;

my $ol = OverloadTest->new;

print Dumper "$ol";
print Dumper $$ol;
print Dumper &$ol;
print Dumper [ @$ol ];

こんなの。String参照とデリファレンスのオーバーロード。

wantarray みたいな用途に使えそう。

ちなみに上のの出力は

$VAR1 = 'fooooooooo';
$VAR1 = 'heh ;)';
$VAR1 = 'bar!!!!';
$VAR1 = [
          'blah',
          'blah',
          'blahhh'
        ];

こうなる。

by typester / at 2005-12-03T01:04:00 / perl / Comments(0)