メメメモモ

プログラミング、筋トレ、ゲーム、etc

cronで実行するプログラムでの「use lib」

任意のディレクトリにあるモジュールを読み込む際に、ディレクトリのパスを設定します。
例えば

  • src/
    • main.pl
    • lib/
      • Test.pm
      • Test/
        • Class.pm

という構成があり、main.plからTest.pmを読み込むときのコードは下記のようにします。

use lib 'lib';
use Test;

my $t = Test->new;


ここで、「use lib 'lib';」は相対パス的な指定の仕方なので、
プログラムの実行のディレクトリに依存してしまいます。
カレントディレクトリがmain.plと同じディレクトリであれば問題ありません。
しかし、例えば一段上のディレクトリにいるときに、
perl src/main.pl」という感じで実行すると「Test.pm」が読み込めなくなります。


cronでプログラムが実行される場合に、このことが問題になってしまいます。
ですので、use libには絶対パスを指定する必要があります。
しかし、プログラムにハードコードで絶対パスを書いてしまうのは、良くありません。


そこで利用するのが「FindBin」モジュールです。
$FindBin::Binには、実行されるプログラムファイルがあるディレクトリが格納されています。
これを利用して下記のように指定します。

use FindBin;
use lib $FindBin::Bin . '/lib';


これで、どの場合にもTest.pmのモジュールがあるディレクトリが、絶対パスで指定されるようになりました。