Perl類(包)的繼承是通過@ISA數組來實現的。簡單來說,Perl把它看作目錄名的特殊數組,與@INC數組類似(@INC數組是包含引用路徑)。當Perl在當前類(包)中無法找到所需方法時,便會在該數組列出的類中尋找。
是否是聽起來還是很抽象。。。。。。我放出個例子,供大家參考。一般我看的比較多的例子,@ISA都會和Exporter配合使用。
Arithmetic.pm
package Arithmetic;use strict;use Exporter;#use vars預定義全域變數#如果不使用use vars會報global錯誤,或者使用our。#當然如果不使用use strict的話,就不會報錯了。use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);#這塊,就是我們所說的。將Exproter賦值給@ISA數組@ISA = qw(Exporter);#預設匯出符號@EXPORT = qw(add subtract);#按要求匯出符號,也就是在use的時候必須要特殊制定qw()@EXPORT_OK = qw(multiply divide);#以索引值符號來標記的匯出,該數組中的匯出元素,必須在@EXPORT和@EXPORT_OK中存在。%EXPORT_TAGS = ( Spec => [qw(&add &subtract &multiply ÷)]);sub add{ my ($no1,$no2) = @_; my $result; $result = $no1+$no2; return $result;}sub subtract{ my ($no1,$no2) = @_; my $result; $result = $no1-$no2; return $result;}sub multiply{ my ($no1,$no2) = @_; my $result; $result = $no1*$no2; return $result;}sub divide{ my ($no1,$no2) = @_; my $result; $result = $no1/$no2; return $result;}1;
@EXPORT數組包含預設匯出的變數和函數的名字,當use package時就會得到。而@EXPORT_OK中的變數和函數只有當程式中use package中特別要求時才會匯出。
而%EXPORT_TAGS中的索引值對只允許程式包含那些在@EXPORT和@EXPORT_OK中列出的特定符號組。
script.pl
#! /usr/bin/perl -wuse strict;use warnings;use Arithmetic;#這裡上面所提及的特殊匯入,也就是@Export_OK#use Arithmetic是不包含@Export_OK的use Arithmetic qw(multiply divide);#以索引值符號匯入,!add代表除了它use Arithmetic qw(:Spec !add);print add(1,2),"\n";print multiply(1,2),"\n";print divide(4,2),"\n";
上面的例子,就是@ISA數組的用法。這個例子的意義何在呢?
模組分兩種風格:傳統的和物件導向。
傳統風格的模組,為調用者匯入和使用定義的子常式和變數。
物件導向風格的模組,以類調用。
所以模組有兩種方法來給它的介面提供者來使用:匯出符號、類方法調用。
該例子就屬於前者。