• 对象只是一个引用(也就是一个scalar变量),它恰好知道自己属于哪个类。要告诉一个引用它所指向的内容属于哪个类,使用。要知道引用所指向的内容属于哪个类(如果有的话),使用[ref](http://perldoc.perl.org/functions/ref.html)

    • 方法只是一个子程序,接受对象(或者对于类的方法,就是包名)作为第一个参数。使用$obj->method()可以调用对象的方法,用Package::Name->method()可以调用类的方法。(译者注:所谓类的方法,在其他语言里就相当于类的静态方法。)

    • 就是包含一组方法的包。

    下面有个简短的例子来帮助我们弄清楚这些概念。示例模块Animal.pm包含Animal类,内容如下:

    1. require Animal;
    2. "legs" => 4,
    3. "colour" => "brown",
    4. }; # $animal是一个普通的hash的引用
    5. print ref $animal; # "HASH"
    6. print ref $animal; # "Animal"

    注意:任何引用都可以被转换(bless)成任何类的对象。需要由你来保证(1)这个引用指向的内容可以被当做这个类的对象来使用,并且(2)被转换成的这个类存在,并且已经被加载了。

    你仍然可以按以前的方式操作这个hash:

    但你也可以同样用->运算符调用这个对象的方法,就像这样:

    1. $animal->eat("insects", "curry", "eucalyptus");

    最后那句调用等价于Animal::eat($animal, "insects", "curry", "eucalyptus")

    构造函数

    然后像下面这样使用:

      继承

      要创建一个类继承自基类,用use parent,假设我们给Animal创建一个子类叫Koala,位于Koala.pm

      下面是一些示例程序:

      1. use strict;
      2. use warnings;
      3. require Koala;
      4. my $koala = Koala->new();

      最后那个方法调用尝试执行Koala::eat($koala, "insects", "curry", "eucalyptus"),但子程序eat()并没有在Koala包里定义。然而,因为Koala有父类Animal,Perl解释器会再尝试调用Animal::eat($koala, "insects", "curry", "eucalyptus"),这回没问题。请注意Animal类是如何自动被加载的。