ライブラリ
サブルーチン集を作る
サブルーチンを学習した時に、サブルーチンを作成することによって
独自の命令セットを作成でき、よりプログラムの可能性を上げることができることがわかりました
大切なのは プログラムの再利用 です。つまり、使い回しです
できるかぎり一度作った複雑なプログラムを何度も作るのは避けたいです
そこで、このプログラムをいろんな開発現場で生かすとすれば外部ファイルにしたほうが良いことに気づきます
そこでライブラリと呼ばれるファイルを作成します
多くのライブラリの目的はサブルーチン集ですが、グローバル変数をライブラリで初期化するという方法もあります
ライブラリファイルの拡張子は .plが一般的ですが、必ずこれにしなければいけないわけではありません
ただし、ライブラリのお約束でスクリプトの最後に1をつけることを忘れないで下さい
この1は「真」を意味します
ライブラリを呼び出すには require() 関数を使います
require("file-name")
()の中のファイルネームの指定にはディレクトリを含めることもできます
ディレクトリを省略した場合は、現在のディレクトリとPerl標準の設定ディレクトリ探します
まず、以下のライブラリファイルを作成しましょう
# lib.pl
sub strcat {
my($str) = \$_[0];
for($re = 0 ; $re < @_ - 1; $re++) {
$$str .= $_[$re + 1];
}
return(1);
}
1;
これをlib.plというファイルネームで保存します
ライブラリファイルなので、最後に1を返すことを忘れないで下さい
このファイルでは、サブルーチン strcat を作成しています
これを他のファイルから読み込むことで、どのスクリプトでも strcat() を呼び出すだけでこのルーチンを使いまわすことができます
require("lib.pl");
&strcat($s , "ひざの上の" , "同居人");
print $s;
strcatは第一引数に指定された変数に対して、以降の引数加算して代入します
このようにして、自分でよく使う命令をセットにして、他のスクリプトで使いまわすことができます
パッケージ化
このようなプログラムの再利用を考えると、グローバル変数同様の問題が浮上します
ライブラリ内のサブルーチンや変数名が、呼び出し側メインルーチンにも同名である場合が考えられます
このときエラーは出ずに、後から定義されたほうが優先されます
そのため一度ハマルとデバッグが困難になります
そこでライブラリをパッケージとして、メインルーチンからの呼び出しを明示的にするようにします
パッケージを宣言された場合、呼び出し側は必ず以下のようにパッケージ名を指定しなければいけません
pac-name::name
この::を使って、パッケージ名::変数、ルーチン名 とすることで、その関係をはっきりさせます
パッケージを宣言するにはライブラリファイル側でパッケージ名を指定します
package pac-name
ここで指定した pac-name が呼び出し側で指定するパッケージ名になります
先ほどのライブラリをパッケージ化して呼び出してみましょう
# lib.pl
package string;
sub strcat {
my($str) = \$_[0];
for($re = 0 ; $re < @_ - 1; $re++) {
$$str .= $_[$re + 1];
}
return(1);
}
1;
例によって、次は呼び出すメインルーチンを作成します
require("lib.pl");
&string::strcat($s , "ひざの上の" , "同居人");
print $s;
パッケージ名を省略した場合は呼び出し側のファイルで宣言されているサブルーチンを指します
もちろんなければPerlはエラーを出します
BIGINとENDルーチン
さらにライブラリには、特殊ルーチン BEGINとEND が存在します
このルーチンはメインルーチンの開始時と終了時に自動で呼び出されるものです
BEGINとENDルーチンから他のルーチンを呼び出す場合は
必ずそのルーチンがBEGINやENDの前の行になければいけません
# lib.pl
package begin_end;
BEGIN {
$get_argv = $ARGV[0];
}
END {
print "End of Perl\n" ;
}
1;
あとはこれを呼び出すメインルーチンを作成します
require("lib.pl");
print "$begin_end::get_argv\n";
BEGINとENDルーチンは呼び出す必要がなく、メインルーチンの開始時にBEGINが
メインルーチンの終了時にENDが自動的に呼び出されます
require("file-name")
ライブラリファイルを呼び出します
file-nameにはライブラリファイルのパスを指定します。ディレクトリを含むことも可能です
package pac-name
ライブラリやモジュールにパッケージ名を宣言します
パッケージ名を指定されたライブラリやモジュールは、メインルーチンから呼び出す場合
明示的にパッケージ名を指定しなければいけなくなります
pac-nameにはそのライブラリやモジュールのパッケージ名を指定します