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 が使われてるかもしれない。

参考