20
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Perlモジュールの読み込みに失敗する場合のチェックポイント

Last updated at Posted at 2012-05-26

結論から言うと 3 のケースがいっちゃんだるい。

 

1. モジュールのパス通してるか

このケースの典型エラーメッセージ

Can't locate Foo/Bar.pm in @INC

(※ 後述するがパスを通してない以外の原因でもこのメッセージが出ることがある)

対処法

use lib 'モジュールを置いてる Dir'; のしわすれてると思われる。ので、する。

use lib ってなんぞ? とか @INC がわからない場合はここを読むいいでしょう。

モジュールの検索パスを調べる @INC - サンプルコードによるPerl入門

さらに詳しい解説がほしいばあいは perldoc -v @INC するもよし、あるいはほとんどのPerl入門書に解説が書いてるのでそれを読むもよし。

 

2. モジュールの最後で 1; してるか

このケースの典型エラーメッセージ

Foo/Bar.pm did not return a true value at ...

対処法

モジュールの最後で 1; する。(真を返す値ならなんでもいいけど)

 

3. パッケージ名の Typo

まともなエラーが出ない場合があるから一番めんどくさい

チェックポイント

a. そのモジュールを使うスクリプトのなかで正しい名前で use してるか
b. そのモジュールのディレクトリとファイル名が合ってるか(Foo::Bar というモジュールなら Foo/Bar.pm という名前が合ってるか)
c. そのモジュール内の パッケージ宣言で記述した名前があってるか(Foo/Bar.pm 内で package Foo::Bar; と確かに正しく書かれているか)

a と b は Can't locate ... とエラーが出て死ぬからまだ気づきやすいんだけど、b のケースは ロードまでは成功してしまう(メソッドを呼ぼうとした時点で突然の死を迎える) から一番厄介。

逆に言うと、ロードは成功してるのに メソッドの呼び出し で「そんなメソッドねーよ!」と怒られて死ぬ(確かに定義してるのに!)場合は、 c のケースを疑うと良い でしょう。

20
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?