今回はPerlのオブジェクト指向について。
Javaほどの厳密性はありませんが、Perlでもオブジェクト指向的なプログラミングを行うことは可能です。
今回はPerlのオブジェクト指向をさらっと基本的な部分(名前空間、コンストラクタ、継承)だけ見ていきたいと思います。
名前空間とPackage
プログラミングでは規模が大きくなってくると変数名や関数名がかぶってしまうことが見られます。
これが重要な変数だった場合、意図しない上書きなどをしてしまう可能性があります。そのために同じtitleという変数名であっても”どの”titleなのかということを明記しておく必要があります。
この”どの”に当たる概念が名前空間であり、perlではこれを下記のように書きます。
package Point
こうしておくとPointのtitleということを明記できますので、変数名の衝突を防ぐことができます。
階層が複雑な場合は、 package Foo::Bar::Point などともかきます。
コンストラクタ
Perlではコンストラクタの概念が難しいです。
1 2 3 4 5 |
sub new { my $class = shift; my $self = {}; return bless $self, $class; } |
上記のコードの場合 下記のような流れになります。
- インスタンス生成時、$classはクラス名を受け取る
- 無名のハッシュが$selfの参照先になる(初期値が空という意味。)
- return blessにより無名のハッシュがクラス名をつけられて、クラスオブジェクトとなる
use / use base
Perlでは他のモジュールを利用するときはuse パッケージ名として使用することが一般的です。(拡張子がpmじゃないと呼べません)
また継承を行うときはuse baseとして呼び出します。
初期値があるインスタンス生成は下記のように作成します。
1 2 3 4 5 6 7 8 9 10 11 |
sub new { my $class = shift; my $self ={ @_ }; bless $self, $class; } #呼び出す側 インスタンス = クラス名->new('引数1' =>値1, '引数2' => 値2 ); |
似たようなファイルの読み込みにrequireがありますが、下記のような点が違います。
- useはコンパイル時に評価、requireは実行時に評価
そのほかの参考リンク
Perl のクラスって個性的ですね!(生で見えるオブジェクト指向)
業務に役立つPerl
Perlオブジェクト基礎文法最速マスター
Perl の use と require の違い