サブルーチンなどの定義を独立したファイルに記述しておけば、複数のコードからそのファイルをインクルードして使いまわすことができます。
下記の例では、サブルーチンの定義を mylib.pl
というファイルにまとめ、このファイルを require
演算子でインクルードしています(pl という拡張子は、Perl Library の略です)。
sub greet {
print "Hello\n";
}
1;
require 'mylib.pl';
&greet();
require
演算子は、既にインクルード済みのファイル名を覚えているので、重複したインクルードを避けてくれます。
インクルードされるファイルに構文エラーが存在する場合、require
演算子は自動的に die
を実行します。
インクルードされるファイルで最後に評価される値は、真にならなければいけないので、慣例として最後の行に 1;
と書きます。
require
の代わりに do
演算子を使用すると、ファイルを無条件でインクルードします(重複したインクルードでもお構いなし)。
do
によってインクルードされたファイルに構文エラーが存在すると、変数 $@
が設定されるので、この値を使って die
できます。
do 'mylib.pl';
die $@ if $@;
require
や do
演算子によってインクルードするライブラリの検索パスは、@INC
という特殊変数に設定されています。
$ perl -le 'print for @INC'
/usr/site/lib
/usr/lib
.
デフォルトでカレントディレクトリが検索パスに含まれているので、ライブラリはカレントディレクトリに置けば読み込めます。
ライブラリの検索パスを追加するには次のような方法があります。
export PERL5LIB=/home/joe/perl-lib
$ perl -I/home/joe/perl-lib myprog
unshift @INC, '/home/joe/perl-lib';
(c) の方法は、use
でモジュールをインポートする場合には効果がありません。
なぜなら、use
によるインポートはコンパイル時に行われてしまうからです。
unshift @INC, '/home/joe/perl-lib';
use MyLib; # こっちが先に実行されてしまう×
これを防ぐには、use lib
プラグマを使用して検索パスを追加するようにします。
use lib '/home/mike/lib'; # コンパイル時に検索パスが追加される○
use MyLib;