メソッドサーチ

UNIVERSAL や AUTOLOAD を勉強しましたが、ラクダ本に書かれている「Perl がメソッドを探す順番」(メソッドサーチの順番)をまとめてみます。

use Student;
my $palmo = Student->new();
$palmo->doit();

を実行した際に、Perl が doit メソッドを探す時の順番とします。

  1. Student::doit を探す
  2. @Student::ISA をたどって全親クラスから doit を再帰的に探す
  3. UNIVERSAL::doit を探す
  4. Student::AUTOLOAD を探す
  5. @Student::ISA をたどって全親クラスから AUTOLOAD を再帰的に探す
  6. UNIVERSAL::AUTOLOAD を探す

Perl は以上のリストを順番に探していき、メソッドを見つけ次第実行します。つまり、上のものほど優先度が高い、という事になります。
まずは指定されたメソッドを親クラスなどを再帰的にサーチします。メソッドがどこにも見つからなかった時に、初めて AUTOLOAD メソッドがあるかどうか確認されます。
つまり AUTOLOAD を使う場合、普通のメソッドコールより遅いんですね。実行速度が大事な場面では AUTOLOAD はなるべく使わないようにしたほうが良さそうです。
この順番で全てを探しても、対応できるメソッドが見つからない場合に、初めて Perl はエラーを出します。