perlのパッケージ化
さてはてJavaのサーブレットやPHPやrubyなご時世ですが、初心者には取っつきにくい!!
特にJavaのサーブレット先生は環境の整備に初心者は挫折したりしなかったり。

そんな貴方でも、perlなら無料webサービスで使えることが多々あるし、
書き方がちょっと独特だけど覚えちゃえば簡単チンチンなわけで、これからもperlを推奨していきたい今日この頃ですが、
意外とperlでパッケージ化する人って少ないんじゃないかと、かの有名なjcode.plなんてのはありますが、
個人的な開発にパッケージ化は不要、てかめんどくせぇって人が大半だと思われます。

そもそもパッケージ化する意味とは、

・ソースを分解できるからいろんな人と開発ができる。
・似たような処理をまとめることで、ソース全体が少なくなる。
・複雑な処理をまとめることで、ソースの修正が楽になる。
・なんかかっこいい。

でしょう!!たぶん。



ってことで、今回は簡単にパッケージ化する方法を教えます。
ちなみに対象はプログラム初心者ということで。



まず、ふつーに簡単なコードを書いてみましょうかしら。

----------------------
[ソース]
$a = 7;
$b = 13;

$c = $a + $b;

print $c;

----------------------
[実行結果]
20
----------------------

んー素晴らしきかなperlの世界、ということで、上記のソースを見ていただければプログラムを知らない人でも簡単明快。
$aという変数に7が入って、
$bという変数に13が入って、
$cという変数は$aと$bを足したもの(つまり20)が入って、
最後に$cを表示しまっせ、
ってな流れです。

まずはこれを、ルーチン化します。

----------------------
[ソース]
$a = 7;
$b = 13;

$c = &add($a, $b);

print $c;

sub add {
return $_[0] + $_[1];
}

----------------------
[実行結果]
20
----------------------

値はそのままなので、さっきと結果は一緒ですが、
ソースの一部をルーチン化しました。

流れとしては、
$aという変数に7が入って、
$bという変数に13が入って、
$cという変数には「ルーチンaddさんに$aと$bを渡してあげて、帰ってきた値」を入れて、
最後に$cを表示する
といった感じです。

途中に出てきた「ルーチンaddさんに$aと$bを渡してあげて、帰ってきた値」という部分ですが、
ソースでいうところの
sub add {
return $_[0] + $_[1];
}
になります。

まず、
&add($a, $b)
というのは、ルーチンaddに、引数1番目は$a、引数2番目は$bを渡すという意味で、
渡されてしまったaddさんは

return $_[0] + $_[1];

という処理を行います。

ここでの$_[0]は引数1番目、$_[1]は引数2番目ということになり、
今回の場合だと
$_[0]は$a、つまり7
$_[1]は$b、つまり13
で、returnは戻り値の意味で、ここでいう
return $_[0] + $_[1];

戻り値 7 + 13 (つまり20)
ということになります。





さてはて、ルーチン大先生のおかげで今の世の中が成り立っているようなもので、
いい感じに理解できたところでパッケージ化について。

さっきのルーチンaddさんですが、他のプログラムでも死ぬほど使いたいぜーってなった場合、
他のプログラムにも同様にコピペで
sub add {
return $_[0] + $_[1];
}
を書いてもいいんですが、ここで問題が発生します。

・コピペすんのめんどくせぇよ
・既にルーチンaddがあったらどうしよ
・てかこのルーチンaddが間違ってたら、コピペしたやつ全部修正かよ

ってことになります。
特に一番多いのが、ソースが間違っていた場合です。
間違っていたというよりは、もっと簡略化できる方法が見つかった場合に、
いちいち修正するのが大変になります。

いいソースは使い回してあげようぜ、というのがパッケージ化です。



先ほどの例で、ルーチンaddをパッケージ化してみましょう。

----------------------
[メインソース]
require './unko.pl';

$a = 7;
$b = 13;

$c = &unko::add($a, $b);

print $c;

----------------------
[パッケージソース (ファイル名は「unko.pl」)]
package unko;
$rcsid = q$Id: unko.pl,v 1.00 2007/02/26 05:00:00 mc255 Exp $;

sub add {
return $_[0] + $_[1];
}

----------------------
[実行結果]
20
----------------------

ちょっとややこしいですが、計算そのものは一緒です。

まず、ここで注目すべきは、

メインソースの
require './unko.pl';
$c = &unko::add($a, $b);



パッケージソースの
package unko;
$rcsid = q$Id: unko.pl,v 1.00 2007/02/26 05:00:00 mc255 Exp $;

でしょう。

まず先にパッケージソースの方から解説します。

package unko;
は、このunko.plというファイルのパッケージ名を示しています。
ここでは「unko」と指定していますが、別になんでもいいです。
但し、ここで決めたパッケージ名は、メインソースで使う場合に重要なので、
なるべくわかりやすい名前にしましょう。

$rcsid = q$Id: unko.pl,v 1.00 2007/02/26 05:00:00 mc255 Exp $;
これはなんというか、おまじないみたいなものだと思ってください。
このパッケージのアレコレを簡単に明記したものだと(´Д`;)

あとは、メインソースのサブルーチンaddを、そのまま書いてあげれば終了です。

次にメインソースですが、
まず、
require './unko.pl';
というのは、パッケージファイル「unko.pl」を読み込んで使っちゃうぜーって意味です。
これを指定してあげないと、unko.plはとっても寂しいです。

パッケージを使う準備ができたら、次は実際に使ってあげます。

$c = &unko::add($a, $b);

これです。
最初の方では
$c = &add($a, $b);
になっていましたが、「unko::」というものが追加されています。

つまり、
$cという変数には、「パッケージunkoのルーチンaddに、引数$aと$bを渡して返ってきた値を入れる」
ということなんですねぇ。



これでパッケージ化が完成したわけです。
他のperlプログラムを書くときに、わざわざ同じ処理を書かなくても、
パッケージを読み込んであげればいくらでも再利用ができます。






あまり関係ないんですが、
オブジェクト指向プログラミングがわからない人にオブジェクト指向プログラミングを教える場合、
俺なら間違いなくシューティングゲームを例にします。

「まず敵や敵の弾を一つのオブジェクトとして考えるんだ!!」みたいな感じで(´Д`;)
Comment投稿

豚小屋

糞豚大先生