created: 2021-05-31T02:15:14.000Z
perlでモジュール検索パスの追加に `FindBin` を使う
まず FindBin
とは
FindBin
を use したスクリプトのディレクトリ名(絶対パス)を取得してくれる- 「実行しているスクリプトの所在がわかる」とも言える
FindBin
で取得したパスを使って、モジュール読み込みパスにlib配下を追加する
use FindBin;
use lib "$FindBin::Bin/lib";
FindBin::libs とは
FindBin::libs - locate and a 'use lib' or export directories based on $FindBin::Bin.
↑で示した読み込みパスへの lib
ディレクトリの追加ごとやってくれるパッケージ。
探してくれるディレクトリ名はオプションで指定することができるが、デフォルトは lib
となっている。
# same as above with explicit defaults.
use FindBin::libs qw( base=lib use=1 noexport noprint );
動作
FindBin::libs
を使うと @INC
がどのように変わるかを確認する
まず使わない場合
#!/usr/bin/env perl
print join("\n", @INC);
/usr/local/lib/perl5/site_perl/5.32.1/x86_64-linux-gnu
/usr/local/lib/perl5/site_perl/5.32.1
/usr/local/lib/perl5/vendor_perl/5.32.1/x86_64-linux-gnu
/usr/local/lib/perl5/vendor_perl/5.32.1
/usr/local/lib/perl5/5.32.1/x86_64-linux-gnu
/usr/local/lib/perl5/5.32.1
まず使った場合
/proj/app/tools/_.pl
を実行した場合
#!/usr/bin/env perl
use FindBin::libs;
print join("\n", @INC);
/proj/app/lib
/usr/local/lib/perl5/site_perl/5.32.1/x86_64-linux-gnu
/usr/local/lib/perl5/site_perl/5.32.1
/usr/local/lib/perl5/vendor_perl/5.32.1/x86_64-linux-gnu
/usr/local/lib/perl5/vendor_perl/5.32.1
/usr/local/lib/perl5/5.32.1/x86_64-linux-gnu
/usr/local/lib/perl5/5.32.1
/proj/app/lib
というパスが @INC
に追加されているのがわかる。
その他
モジュールの検索パスを @INC
に追加する方法は以下の3つがある
- コード上で
@INC
を操作する - perlの起動オプション
-I
- 環境変数
PERL5LIB
意図しないパスが @INC
に追加されている場合は環境変数 PERL5LIB
が使われてるかもしれない。