天天看點

EXPORT 和EXPORT_OK

EXPORT 

實作子產品的預設導入方法


In module YourModule.pm:  


[root@node01 perl]# cat ex1.pm 
  package ex1;
  require Exporter;
  @ISA = qw(Exporter);
  @EXPORT_OK = qw($munge frobnicate);  # symbols to export on request
  my $munge='aaaa';
1;
[root@node01 perl]# cat a3.pl 
use ex1 qw($munge);;
print $munge;

[root@node01 perl]# perl a3.pl 
[root@node01 perl]# 


[root@node01 perl]# cat ex1.pm 
  package ex1;
  require Exporter;
  @ISA = qw(Exporter);
  @EXPORT_OK = qw($munge frobnicate);  # symbols to export on request
  $munge='aaaa';
1;
[root@node01 perl]# cat a3.pl 
use ex1 qw($munge);;
print $munge;

[root@node01 perl]# perl a3.pl 
aaaa[root@node01 perl]# 

包裡的變量導出 需要全局變量


[root@node01 perl]# cat ex1.pm 
  package ex1;
  require Exporter;
  @ISA = qw(Exporter);
  @EXPORT_OK = qw($munge frobnicate);  # symbols to export on request
  $munge='aaaa';
  $a='bbbbbbbb';
  $c='cccccccc';
  sub frobnicate {
   my $a=shift;
   my $b=shift;
   return $a + $b;
};
1;
[root@node01 perl]# cat a3.pl 
use ex1 qw($munge frobnicate);;
print $munge;
print "\n";
print frobnicate(23,34);
print "\n";
print $a;
print "\n";

[root@node01 perl]# perl a3.pl 
aaaa
57


描述:

Exporter 子產品實作一個導入方法允許一個子產品來導出函數和變量到使用者的名字空間。

很多子產品使用Exporter 相比實作它們自己的import 方法。

因為Exporter 提供一個高度靈活的接口.

Perl 自動 調用import 方法 當處理一個use 語句用于一個子產品。

子產品和使用是記錄在 perlfunc and perlmod.


了解子產品的内容和如何使用語句操作是重要的對于了解Exporter.

如何導出:

數組 @EXPORT 和@EXPORT_OK 是一個子產品用于一組符号表

準備被導出到使用者的名字空間,或者 它們可以被請求導出,

分别的。

符号可以表示函數,标量,數組,hashes或者類型團。

符号必須給定全名 但是函數前面的符号是可選的

    @EXPORT    = qw(afunc $scalar @array);   # afunc is a function
    @EXPORT_OK = qw(&bfunc %hash *typeglob); # explicit prefix on &bfunc

如果你隻是導出函數名字 是推薦省略符号,這樣更快

選擇需要導出的

不到導出方法名字!

不要導出任何否則預設

Exports  污染 子產品使用者的名字空間。

如果你必須導出嘗試使用@EXPORT_OK優先于@EXPORT 避免沖出



通常 任何不被導出的仍舊可以通路從外部 使用YourModule::item_name (or $blessed_ref->method) syntax


事實上,它是可以得到私有函數通過:

如何導入:

在其他檔案 希望使用你的子產品 有3種基本方式用于加載你的子產品和導入它的符号:

use YourModule;



這個導入所有的符号從YourModule's @EXPORT 到你的名字空間

use YourModule ();

這個導緻Perl來加載你的子產品 但是不導入任何符号表

use YourModule qw(...);

這個将調用列出的符号到名字空間。所有列出的符号必須是在你的@EXPORT or @EXPORT_OK,否則一個錯誤發生。