Perl

オブジェクト

Perlでは、上記のリファレンスとパッケージを組み合わせることにより、クラスベースのオブジェクト指向を実現している。
package Class;

# コンストラクタ
sub new {
    my $class = shift;
    my $self  = { @_ };
    bless $self, $class;
}

# アクセサ
sub meth {
    my $self = shift;
    $self->{meth} = shift if @_;
    $self->{meth};
}
オブジェクトを使うときは以下のようにする。
my $obj = Class->new( meth => 'od' );
warn $obj->meth; # 'od';
なぜこれが動くのかというと実は、Perlはこれを以下のように解釈している。
my $obj = Class::new( 'Class', meth => 'od' );
warn Class::meth($obj);
Perlにおいて、クラスはただのパッケージであり、オブジェクトはただのblessされたリファレンスであり、そしてメソッドは第一引数にオブジェクトをとるただのサブルーチンである。これはPerl 4との互換性を考慮してこのような「後付け」の設計となったのだが、驚くべき柔軟性を示す。これだけで継承委譲も出来てしまうのだ。最初からオブジェクト指向のもとに設計された言語から見ると見た目は変であるが、それらの言語にまさるとも劣らないオブジェクト機能をPerlは持っている。

戻る