Perl/ライブラリ・モジュールとオブジェクト指向
出典: フリー教科書『ウィキブックス(Wikibooks)』
目次 |
[編集] ライブラリ・モジュール
[編集] プラグマ
プラグマはPerlの機能を拡張するモジュールです。慣習としてすべて小文字の名前を持ちます。
[編集] strict
strictプラグマを有効にすると、宣言済みでないグローバル変数やシンボリックリファレンスなど危険なものの使用を禁止します。それらが出現した時点で例外を発生させ、プログラムを終了します。
use strict;
use モジュール名;とすると、モジュールを使用することができます。対義語はno モジュール名;で、モジュールを不使用にします。
use strict; { no strict 'refs'; # このブロックの中ではシンボリックリファレンスを使用可能にする }
strictプラグマはレキシカルスコープを持つので、このようにブロック内でのみ無効にするということができます。
[編集] warnings
これはperlの-wスイッチと同じで、無意味な演算や未定義の変数の使用、一度も使用されていない変数などに対する警告を有効にします。これはstrictプラグマと共に、常に有効にすることが推奨されることがあります。
[編集] 標準ライブラリ
perlに標準で同梱されているライブラリのことを標準ライブラリといいます。標準ライブラリ以外のライブラリは、CPANなどから入手します。
[編集] CPAN
CPAN (Comprehensive Perl Archive Network) とは、Perlのライブラリ、モジュール、その他のスクリプトなどを集めた世界的なアーカイブネットワークです。標準モジュールのCPAN.pmでは、シェルからcpanコマンドを使ってCPANのモジュールをインストールするインタフェースを提供しています。
[編集] ライブラリを作成する
[編集] Perlとオブジェクト指向
オブジェクト指向そのものについてはここでは扱いませんのでオブジェクト指向やJava、Smalltalk等についての文献を参照して下さい。
Perlでオブジェクト指向プログラミングを行う場合にも実行環境等を調整する必要はありません。バージョン5以降のPerlでは特別な準備をすることなくそのままオブジェクト指向の機能が使えます。
- Perlでオブジェクト指向を扱う場合にも、一般にオブジェクト指向で禁止されることも多い「多重継承」や「他のクラスからの直接のメンバアクセス」等の振る舞いが許容されます。これはPerlのオブジェクト指向が純粋なオブジェクト指向プログラミング言語のそれと方向性を別にしていることを示唆しています。Perlのプログラミングにおいてオブジェクト指向を導入した場合でもそれによって制限が生じることはほとんどありません。振る舞いに制限を加えることによってオブジェクト指向のメリットを確保しようとする多くのオブジェクト指向プログラミング言語とは対極に、Perlのオブジェクト指向はほとんどの局面において「機能の追加」に終始します。
[編集] オブジェクト指向Perlの前提知識
オブジェクト指向Perlを理解するにはリファレンスとライブラリ・モジュールについての知識が不可欠です。
[編集] オブジェクト指向Perlの記述例
典型的なオブジェクト指向Perlのコードは以下のようなものです。以下の記述をベースにオブジェクト指向Perlについて説明します。
| コード |
package MyClass;
use strict;
use warnings;
use OtherClass;
use SomeClass;
use base qw(OtherClass SomeClass);
sub new {
my $class = shift;
my %args = @_;
my $obj = { %args };
bless $obj, $class;
$obj->init();
return $obj;
}
sub init {
my $self = shift;
$self->do_something();
}
sub run {
my $self = shift;
do_anything();
}
package main;
my $obj = MyClass->new();
$obj->run();
|
[編集] コンストラクタ
コンストラクタはオブジェクトを返すサブルーチンです。他の多くの言語と同じく、newという名前を付けることが一般的です。
use MyClass; my $obj = MyClass->new(); # $obj = new MyClass(); でも可
[編集] オブジェクト
Perlでいうオブジェクトとは、簡単に言うと所属しているクラス(パッケージ)を知っているリファレンスです。コンストラクタ内で、bless関数にリファレンスとパッケージ名を渡すことで生成されます。
sub new { my $class = shift; my $self = {}; return bless $self, $class; }
メンバ変数を保持するため、リファレンスにはハッシュのリファレンスを用いることが多いですが、クラスの性質によっては別なデータ型が用いられることもあります。
ハッシュはキー(名前)によって値を取り出すことができるため、プロパティの役割を果たします。
[編集] クラス
クラスの宣言はpackage宣言によって行います。これはライブラリ・モジュールがパッケージを宣言するのと文法的には全く同じです。
[編集] メソッド
メソッドの定義は関数定義と同じsubによって行われます。メソッドは第一引数にオブジェクトが渡されるサブルーチンです。
$obj->getName();
このようにしてアクセスされるメソッドは、
sub getName { my $self = shift; return $self->{name}; }
このように定義されているでしょう。
[編集] メンバ
一般にクラス変数としてはパッケージ変数を、インスタンス変数としてはオブジェクト自身のリファレンスの内部に格納したデータをメンバに相当するデータとして扱います。
[編集] 継承
$obj->getName();
としたとき、Perlは$objのクラスに属するgetNameという名前のメソッドを探しにいきます。もし見つからなかった場合は、@ISAという特殊な配列に格納されているクラスにgetNameという名前のメソッドを探しにいきます。
@ISAにベースクラスの名前を入れておくことで、継承を実現することができます。
package BaseClass; package MyClass; use BaseClass; our @ISA = qw( BaseClass ); # MyClassはBaseClassを継承した
@ISAに複数のクラス名を代入すると、多重継承になります。
SUPER擬似クラスは、常にベースクラスを指しています。ベースクラスのメソッドを子クラス内で呼び出す場合に使用します。
package MyClass; sub new { my $class = shift; my $self = $class->SUPER::new(@_); return $self; }
baseプラグマを使うと、ベースクラスの定義に必要なuseや@ISAの代入からベースクラス内の変数や関数のインポートまでをすべて自動で行うことができます。
package BaseClass; package MyClass; use base qw(BaseClass);