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