読者です 読者をやめる 読者になる 読者になる

自作モジュールをuseするときの注意点

perl

あほな事にはまって、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 ファイルから見た相対パスを指定するもんだと思ってた。