清新的Perl(八)——包和模块

任何一门编程语言,之所以能够流行于世上,被程序员们所喜爱。其原因在于代码的能够重复利用,不仅仅可以在语言中方便、快捷的引入自己以前写过的代码,积累的各种轮子,而且还能使用各位编程大神分享出来的工具库。

Perl语言同样也不例外。

在Perl中,命名空间成为包(Package)。包提供了基本构造模块,基于这些构造模块,可以构建更高层次的模块和类概念。包,通常只是一个文件,文件名要与包名称相同,文件名后缀为.pm(perl module简写,意为perl模块)。模块在Perl中是可重用的基本单位。在我们自己的Perl脚本中,可以用“use 模块名”导入一个可重用的模块。

在讨论Perl语言的包和模块之前,我想说一句,如果单纯使用perl完成一些运维工作,写一些脚本之类的。仅仅知道使用use去导入模块就行了。但是,如果想写一些可以重复使用的代码,就需要继续阅读文章下面的部分。

一、符号表和限定名

在讲Perl语言的包和模块时,很多书籍都会讲这两个概念。但是,对于初学者,以及那些长期用于解决实际问题(大部分程序员都是如此)的人来说,不造高深的轮子,这两个概念仅仅知道即可,不必深入阅读(这两个概念,放在和任意种编程语言比较都很懵逼,都不如Rust的生命周期好理解!Perl难学就在于这种自己造的名词太多了有关)。下面,我就简单提一下这两个名词怎么理解:

1.符号表:我们的包或者模块的.pm文件,内部一般包含什么东西呢?可想而知,主要是定义的、需要在其他.pl文件中使用的函数、变量,而这些函数、标量组成的列表,就是符号表。符号表,是perl语言编译器自己用于知道一个.pm文件包含哪些函数、变量用的。

2.限定名:这个概念,在后续使用模块时会偶尔用到。限定名这个概念,主要指一个模块中的变量或者函数的全名。下面,我通过一个例子解释一下:

例如说(举个例子,实际模块中没有)在DBI模块中,存在一个$example_var变量和example_sub()方法,当我们在程序中使用use DBI引入模块后,如果在你的程序中同样存在一个$example_var变量和一个example_sub()方法时,怎么区分二者呢?

这就是限定名的作用,我们可以在名称前面增加DBI::前缀来表示DBI模块中的变量和方法,这就写作DBI::$example_var和DBI::example_sub()。对于我们自己程序中的变量和函数,实际上,同样存在一个限定名main::,只是在默认情况下可以省略,这就成为了main::$example_var和main::example_sub()。

二、包和模块名称

拿一些会经常使用的模块名称来说吧,例如telnet模块Net::Telnet,SSH模块Net::SSH,或者Cisco交换机配套的Net::Telnet::Cisco。

对于这些名称而言,可以这样理解(仅仅是理解,不一定正确):用“::”分割的词语,最后一位是模块的名称,而前面的几位,相当于分类、类别。例如说Net::前缀,表示的是网络类的模块,而Net::Telnet::Cisco来说,Net::Telnet::意味从Net::Telnet的进一步开发出来的模块。而这种起名称的方式,仅仅是字面意思,或者说是为了更好理解,实际上换其他名称也可以。

当然了,这些::标志分隔的单词,还有另一种意思,代表的放置.pm文件的路径名称,而::最后一位是文件名,从右向左依次为上级目录的名称。

例如 Net::Telnet::Cisco,代表的是Net/Telnet/Cisco.pm文件。而Net::Telnet代表的是,Net目录下的Telnet.pm,SSH.pm同理。

当我们使用use Net::Telnet::Cisco 时,perl会自动的将::替换为路径分隔符,并在末尾增加后缀.pm,然后去查找目录并引入模块文件。

三、AUTOLOAD

这个东西一般是用来写给其他开发者使用的模块,也就是造轮子时用的。其用法类似于java的接口、抽象类。基本是用不到的,可以跳过去。

感兴趣的可以自己去翻阅资料,不赘述。

四、构造属于自己的模块

构造模块很简单,根据前面名称和对应的目录放置模块,然后在.pm文件中添加标准的三句话即可,如下所示:

package Example;
#标准三件套:
require Exporter;
our @ISA = qw(Exporter);
our @EXPORTER = qw( helloworld ); #此处放置要导出使用的函数或变量
#end

sub helloworld {
    print "Hello World!/n";
}

1

五、总结

包和模块,相关书籍中涉及的概念很多、很乱,初学者头一次看会被搞得晕头转向。我并不指望各位读者通过阅读《清新的PERL》学会怎么用Perl语言,仅仅想作为一个学习Perl语言的思路,理清Perl中那些独特的、不流行的概念。

标签