Critter は、定義されていないサブクラスであるとしfind
ましょdisplay
う。perlobj のドキュメントで説明されているように、ハードワイヤード サブ呼び出しはメソッド ルックアップを実行しないため、対応は 1 対 1 ではありません。
Perl はサブルーチンがどのパッケージに入っているかをどうやって知るのですか? 矢印の左側を見ると、パッケージ名またはオブジェクトへの参照、つまりパッケージに祝福されたものでなければなりません。いずれにせよ、それは Perl が探し始めるパッケージです。そのパッケージにその名前のサブルーチンがない場合、Perl はそのパッケージの基本クラスでそれを探し始めます。
サブルーチンを使用すると、それが静的にどこにあるかを正確に知る必要があります。そうしないと、プログラムがdie
. メソッドを呼び出すには、検索を開始する場所を指定するだけです。
例えば:
#! /usr/bin/env perl
package Critter;
sub new { bless {}, shift }
sub display { ref($_[0]) . " display" }
package SuperCritter;
@SuperCritter::ISA = qw/ Critter /;
package main;
my $super = SuperCritter->new;
# one of these things is not like the other
warn $super->display;
warn Critter::display($super);
warn SuperCritter::display($super);
出力:
./call-demo 14 行目の SuperCritter 表示。
./call-demo 15 行目の SuperCritter 表示。
未定義のサブルーチン &SuperCritter::display が ./call-demo 行 16 で呼び出されました。