来自perldoc perlobj
(引用此优秀的answer):
my $fred = Critter->find("Fred"); $fred->display("Height", "Weight");
......以上代码大致等同于:
my $fred = Critter::find("Critter", "Fred"); Critter::display($fred, "Height", "Weight");
究竟有什么区别,除了错误检查以确保第一个参数是受祝福的对象或有效的类名?例如。为什么主要但不完全相同?
答案 0 :(得分:15)
Say Critter是一个没有定义find
或display
- 或两者的子类!这种对应关系不是一对一的,因为硬连线子调用不执行方法查找,因为perlobj文档解释过。
Perl如何知道子程序所在的包?通过查看箭头的左侧,它必须是包名称或对象的引用,即。,这是一个幸运的包装。无论哪种方式,这都是Perl开始寻找的包。如果该包没有具有该名称的子例程,则Perl开始在该包的任何基类中查找它,依此类推。
使用sub,您必须确切地知道它的静态位置,或者您的程序将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);
输出:
SuperCritter display at ./call-demo line 14. SuperCritter display at ./call-demo line 15. Undefined subroutine &SuperCritter::display called at ./call-demo line 16.