@EXPORT and @EXPORT_OK

布魯斯XiaoY發表於2016-03-20

@EXPORT

Export subroutines, with no need to initialize an object when you use.
之前有提到過,以下兩種方式等同:

use File::Basename; 
## like
BEGIN { require File::Basename; File::Basename->import; }

其中的import沒有傳入list,並不意味著import nothing,而是將 @EXPORT 裡所有的成員import到當前上下文。如果@EXPORT 不含有任何成員,等同於File::Basename->import; 未執行。

@EXPORT_OK

Export subroutines on demand basis, need qw() when use package.
以上兩個全域性 list 可同時使用,不過需要注意實際匯入的list。 如 @EXPORT_OK = qw(multiply divide); 後直接呼叫add(), subtract 後syntax error。需要 qw (add subtract multiply divide)

##try_arithmetic.pl
use Arithmetic qw (multiply divide);
#print "1+1 = " . add(1,1) . "\n";
#print "1-1 = " . subtract(1, 1) . "\n";
print "2X2 = " . multiply(2, 2) . "\n";
print "4/2 = " . divide(4, 2) . "\n";
package Arithmetic;
use Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(add subtract);
@EXPORT_OK = qw(multiply divide);

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 & @EXPORT_OK 輸出subroutines or attributes 到當前上下文, 以便不用被例項化就能直接呼叫。
  2. @EXPORT_OK 為按需輸出,需要 use XXX; 時以引數形式顯示傳入。
  3. 需要注意, use XXX; 時傳入指定 list 意味著更改了預設 export list(@EXPORT)。也就是說,這個指定的 list 可以不用例項化直接呼叫(當然如果不在 @EXPORT & @EXPORT_OK ,直接呼叫還是會報錯)。

相關文章