hitode909の日記

趣味はマリンスポーツですの日記です

Perlで存在しないメソッドを呼ばれたけど同名のキーがあったらもしかしてとか言いながら死ぬやつ

$user->{name}を呼ぶのが正しいけど$user->nameを呼んでしまったときに,もしかして:->{user} とか出る,みたいなのができる.

package Mosikasite {
    sub new {
        my ($class) = @_;

        bless {}, $class;
    }

    sub AUTOLOAD {
        my ($self) = @_;
        my $method = (split '::', $AUTOLOAD)[-1];
        if (@_ == 1 && exists $self->{$method}) {
            die "もしかして:->{$method}";
        } else {
            die;
        }
    }
};

my $m = Mosikasite->new;
$m->{hoge} = 1;
$m->hoge;

https://gist.github.com/5e61b92f56c4d2c1bc4c

実行結果

% perl a.pl
もしかして:->{hoge} at a.pl line 12.

そもそも->{name}を呼べっていうインターフェイスが変だけど,歴史的にそうなってて直すほどでもない場合などはこういうヒントあると便利な気がする.elseのところdie;っていうのは雑すぎるのでもうちょっとちゃんとしたほうがよさそう.


http://www.flickr.com/photos/52601770@N00/10549087343
photo by rubenerd