自作モジュールをuseするときの注意点
あほな事にはまって、2時間を失った。
戻れ俺の迷走時間・・・。
自作モジュール使いたかった
よく使う機能をまとめて、pmファイルにして、読み込みたかった。
中身は大したことないが、コンフィグファイルを読み込んでいた。
package Common; use YAML; my $config = YAML::LoadFile("config.yaml"); sub new { my ($pkg) = @_; my $hash = {}; my $instance = bless $hash, $pkg; return $instance; } sub hoge { return "hoge"; }
自作モジュールを別階層から複数回呼び出す。
さて、
このモジュールを呼び出すのだが、複数個所から呼び出したかった。
例えばこんな感じ。
呼び出し元A : /www/hoge.pm
呼び出し元B : /www/foo/foo.pm
自作モジュール: /www/lib/common.pm
config.yaml : /www/config.yaml
呼び出し元Aでは
use lib qw(./lib); use Common;
こうして、
呼び出し元Bでは
use lib qw(../lib); use Common;
こうする。
でも、エラー。
エラーの原因は・・・?
呼び出し元Aからは成功する。
でも、呼び出し元Bからは失敗。
その原因は、use lib の指定方法なのかな、と思っていたのだが、見当違いだった。
自作モジュール内での相対パスは、useしたスクリプトからみた相対パス
common.pm 内の
use YAML; my $config = YAML::LoadFile("config.yaml");
この部分。
相対パスにしていたのだが、これを絶対パスにしたら直った。
useしたスクリプトからみた相対パスとして扱うらしい。
つまり
呼び出し元Aから自作モジュールを呼び出すとコンフィグファイルは
/www/config.yaml
を探すのだが
呼び出し元Bから自作モジュールを呼び出すと、
/www/foo/config.yaml
を探してしまうらしい。
てっきり、common.pm ファイルから見た相対パスを指定するもんだと思ってた。