Perlでオブジェクト指向

Perlでクラスを書く方法をメモ。

$$ cat Test.pm
package Test;

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

sub print {
  my $self = shift;
  foreach my $key (keys %$self) {
    print "$key : $self->{$key}\n";
  }
  return;
}

# デストラクタ
sub DESTROY {
  my $self = shift;
  return;
}

1;

これがクラスの雛形。ファイル名はクラス名と同じにする。呼び出し側は以下のようにする。

$$ cat do.pl
#!/usr/local/bin/perl
use strict;
use warnings;
use Test;

my $t = Test->new({x=>10, y=>5});
$t->print();


$$ ./do.pl
x : 10
y : 5


クラスに属するメソッドはクラスメソッドとインスタンスメソッドの2つがある。クラスメソッドは

クラス名->メソッド()

として呼び出し、第1引数にクラス名が入る。インスタンスメソッドは

インスタンス変数->メソッド()

で呼び出し、第1引数にインスタンス変数が入る。インスタンス変数はリファレンスであれば何でもいいのだが、一般にメンバ変数の名前をkey、メンバ変数の値をvalueとしたハッシュへのリファレンスを使うことが多い。

new()はコンストラクタでクラス変数。よって第1引数はクラス名になる。第2引数以降は、普通にメソッドに与えた引数が入る。今回はハッシュリファレンスをnew()の引数に与えているので、これをそのまま$selfに入れてメンバ変数としている。この$selfをクラス名と併せてbless()することでインスタンス変数となる。
他のメソッドはデストラクタも含めすべてインスタンスメソッド。よって第1引数はインスタンス変数になる。この変数はC++で言うところのthisと同じ役割。これを使ってprint()メソッドではメンバ変数を一覧表示している。