模块化、包、库

perl默认工作的包叫main;包的作用范围从声明包到它的最内层循环的结束或者结束于另一个包的声明;包中的变量使用$package::variable表示;

包的扩展概念是模块,模块可以导出符号到其它包,并与类和方法一起工作;模块一般在包名后加.pm扩展名;使用use函数将模块加载到脚本中。

 

符号表:

每个包都有自己的一个符号表,它是一个哈希表;关键字是包中的变量名,值是typeglob;这里解释下typeglob,如果包中有多个相同名字的变量,基类型不一样,比如@var,$var,%var,&var;但是其typeglob都是一个*varperl有内部机制区别这些值;

使用local声明的变量可以在其它包中使用::进行访问;而使用my声明的则不行;

使用如下语句遍历%main::

while(($key, $value) = each (%main::)){

                                 # Look at main's symbol table

        print "$key:\t$value\n";

    }

 

特殊变量@INC包含库的搜索目录路径,要包含@INC以为的路径,在命令行使用-I选项,或者设置PERL5LIB环境变量;

增加搜索路径:unshift(@INC,".");

perl4之前大多数标准库使用.pl结尾,它们由一系列子函数组成。这些库文件现已被.pm文件取代。

为了包含标准库中(主要是.pl)的可执行函数和其它文件形式的perl代码,require函数被使用,类似于cincluderequire搜索@INC中的路径,如果没有,则返回错误信息;require在运行时加载文件到程序中。

 

确保在自定义脚本后增加1;如果你没有在你的库文件的最后一行增加返回值,你将从require函数返回错误:

 

使用perldoc查看模块使用说明;如perldoc CGI

use函数允许Perl模块和程序在编译时导入程序。use函数将不会导入非.pm的模块;

模块可以在子目录中,例如模块bf.pmMath子目录下,使用此模块,需要使用use Math:bf.pm声明;

对于编译指令perl都使用小写字母,如strictvars等;

 

导出导入

导出的模块发送符号给模块的用户;Exporter.pm模块提供必须的语义给模块以使它们能够导出符号;当使用use时,perl自动调用导入方法;Exporter.pm是面向对象的模块,其它模块从Exporter.pm继承导出符号的能力;

require Exporter;

our @ISA=qw(Exporter);