Perl 有着大量的第三方模块(module,即功能库) 可以使用,这也是为什么Perl如此成功的原因。
Perl 允许你将代码划分成一个或多个可重用的模块,在这一章,我们将学习如何去完成下面的工作:
1.使用关键字package 来定义模块
2.使用use和require 来加载预定义模块,我们在前面章节中已经看到了几个使用use的例子
3.使用”::” 记号来存取包的特定变量和子例程
4.在运行时加载函数
包的基本知识
关键词package 标志这一个新的名字空间的开始,在它之后声明的所有的全局标示符
(包括变量名,子例程,文件句柄,打印格式和目录句柄) 都将属于这个包
下面是你如何使用另外一个包中的全局符号的例子:
package ATM; ###开始一个新的名字空间
BankAccount::deposit(10); ##调用一个外部子例程
print $BankAccount::total; ##存取一个外部变量
既然package 语句只表明一个有效的名字空间,因此 你可以在不同的名字空间中自由切换:
package A;
a=10; ##这个a位于包A中
package B;
a=20; ##这个a位于包B中,而且同其他的$a完全独立
包与变量:
在第三章”Typeglob与符号表”中,我曾提到所有的全局名字都位于一个符号表中。
这有点像一个善意的谎言,实际上每个包都有它自己的符号表,它们之间互不相同。
在包main中定义的标识符并不会被特别对待,除了有一点例外,那就是你还可以以另一种
形式”
那些诸如
Perl 允许你在其他包中直接使用它们,而无须加上前缀main::. 这些是Perl中唯一真正的全局变量。
你也许还记得词法变量(my) 同符号和typeglob 没有联系,因此也就与包没有任何关系。
下面的表达式将导致编译错误:
my $bankAccount::total; ##错误
包有文件:
同一个包的声明可以放在多个文件中,或者多个包可以在一个文件中声明。
按照惯例,一个包通常有它自己的文件,而且其文件名为package.pm或者package.pl
以.pm为后缀的文件被称为Perl 模块而在后缀为.pl的文件中的包通常则被称为库。
关键词require 只是把一个文件加载到程序中(在shell 中的说法就是source它),
这实质上于C语言中的#include相同,只是Perl用不着关心该文件是否已经装载过了。
加载路径 首先在内建数组@INC 中指定的路径中查找使用use或require 给定的文件。
默认情况下,@INC 中包含了在解释器安装建立时指定的一些标准路径名。在我的机器上,@INC的内容如下:
jrhmpt01:/root# perl -e ‘print “@INC
”;’
/usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl
/usr/lib64/perl5 /usr/share/perl5 .
私有性:
Perl 中的符号是可以任意存取的,信息隐藏并不是强制的。