Perl中神奇的@EXPORT
@EXPORT
Perl通过继承,可以使子类可以像使用本地方法一样使用其基类的方法。
一个类如果想把自己的方法(变量)暴露给别人使用(比如一些公共基础类的的通用方法或变量),还可将直接将方法(变量)添加到内置数组@EXPORT中即可。示例如下:
[xywang@mnsdev13:~/]$ cat Fred.pm
package Fred;
use Exporter 'import';
@EXPORT = qw(flintstone $var);
sub flintstone{
return 99;
};
our $var="SADA1311";
1;
[xywang@mnsdev13:~/]$ cat test.pl
#!/usr/local/bin/perl5
use Fred ;
print $var;
print "\n";
print flintstone;
[xywang@mnsdev13:~/]$ ./test.pl
SADA1311
99
注意除了将方法和变量加入到@EXPORT中以外,还需要在最开始的时候use Exporter来支持:
use Exporter 'import';
或者
use base qw(Exporter);
@EXPORT_OK
Perl中还有个@EXPORT_OK.
@EXPORT和 @EXPORT_OK基本相同,唯一的区别是如果在@EXPROT中指定的函数或者变量,在其他的地方可以通过use 这个package直接使用该package中export的方法和函数,但是如果在@EXPORT_OK中指定了,在use时,单独use 这个package不行,必须把package中的要使用的EXPORT_OK中的方法名也列出来,如:
[xywang@mnsdev13:~/test/OO/test2]$ cat Fred_export_ok.pm package Fred_export_ok; use Exporter 'import'; @EXPORT_OK = qw(flintstone $var); sub flintstone{ return 99; }; our $var="SADA1311"; 1; [xywang@mnsdev13:~/test/OO/test2]$ cat test.pl #!/usr/local/bin/perl5 use Fred_export_ok; print $var; print "\n"; print flintstone; [xywang@mnsdev13:~/test/OO/test2]$ ./test.pl [xywang@mnsdev13:~/test/OO/test2]$
发现如上test脚本没有任何输出。 但是如果修改test.pl如下:
[xywang@mnsdev13:~/test/OO/test2]$ cat test.pl
#!/usr/local/bin/perl5
use Fred_export_ok qw(flintstone $var);
print $var;
print "\n";
print flintstone;
[xywang@mnsdev13:~/test/OO/test2]$ ./test.pl
SADA1311
99
参考资料:https://stackoverflow.com/questions/17912400/export-vs-export-ok-in-perl