第6章 模块

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中定义的标识符并不会被特别对待,除了有一点例外,那就是你还可以以另一种

形式”::x:x.

那些诸如|,_,@ARGV 和%ENV 之类的内建变量是属于包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 中的符号是可以任意存取的,信息隐藏并不是强制的。

原文地址:https://www.cnblogs.com/hzcya1995/p/13351187.html