自作のモジュールを use してもロードされない問題に悩む修行

モジュールのロードについて実験するため、A.pm と B.pm に test 関数を定義して、次のようなスクリプトを動かしてみた。

use strict;
use warnings;

use A;
use B;

B::test();
my $x = A::test();

実行すると次のようになる。

[takeyuki@sunya ~]$ perl b.pl
Undefined subroutine &B::test called at b.pl line 7.

B.pm は次のように書いてある。

use strict;
use warnings;
package B;
use A;

sub test {
    return 2;
}

# warn "B!!";                                                                   
1;

試しにコメントアウトをはずしてモジュールロード時に warn されるようにしても、これが表示されない。なぜ??

B.pm を BBB.pm にリネームして試したところちゃんと動いた。どういうこと??

そう、正解は B は標準モジュールとして入っているから。

[takeyuki@sunya ~]$ perl -MB -e 'print $B::VERSION;'
1.09_01

次のように BEGIN ブロックでモジュールサーチパスをいじってやれば、自前の B モジュールをロードしてくれるようになる。

BEGIN {
    unshift @INC, '.';
}

http://kaede.to/~canada/doc/doller_a_and_bという話もあるし、関数 y を呼ぶとき - 昨日知ったこと なんてこともあるし、サンプルスクリプトやちょっとした実験スクリプトでも foo, bar とか使うほうがいいんだろう。