Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
17
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@Cside

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

結論から言うと 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 のケースを疑うと良い でしょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
17
Help us understand the problem. What are the problem?