❮ 上一节
下一节 ❯
Perl - 包和模块
什么是包?
package 语句将当前命名上下文切换到指定的命名空间(符号表)。 因此 −
包是位于其自己的命名空间中的代码集合。
命名空间是唯一变量名的命名集合(也称为符号表)。
命名空间可防止包之间的变量名冲突。
包支持构建模块,使用时不会破坏模块自身命名空间之外的变量和函数。
包一直有效,直到调用另一个包语句,或者直到当前块或文件结束。
您可以使用 :: 包限定符显式引用包中的变量。
以下是在文件中包含 main 和 Foo 包的示例。 这里使用了特殊变量 __PACKAGE__ 来打印包名。
#!/usr/bin/perl
# This is main package
$i = 1;
print "Package name : " , __PACKAGE__ , " $i\n";
package Foo;
# This is Foo package
$i = 10;
print "Package name : " , __PACKAGE__ , " $i\n";
package main;
# This is again main package
$i = 100;
print "Package name : " , __PACKAGE__ , " $i\n";
print "Package name : " , __PACKAGE__ , " $Foo::i\n";
1;
执行上述代码时,会产生以下结果 −
Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10
BEGIN 和 END 块
您可以定义任意数量的名为 BEGIN 和 END 的代码块,它们分别充当构造函数和析构函数。
BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
每个 BEGIN 块在 perl 脚本加载和编译之后执行,但在任何其他语句执行之前。
每个 END 块都在 perl 解释器退出之前执行。
BEGIN 和 END 块在创建 Perl 模块时特别有用。
下面的例子展示了它的用法 −
#!/usr/bin/perl
package Foo;
print "Begin and Block Demo\n";
BEGIN {
print "This is BEGIN Block\n"
}
END {
print "This is END Block\n"
}
1;
执行上述代码时,会产生以下结果 −
This is BEGIN Block
Begin and Block Demo
This is END Block
什么是 Perl 模块?
Perl 模块是定义在库文件中的可重用包,其名称与包的名称相同,扩展名为 .pm。
名为 Foo.pm 的 Perl 模块文件可能包含这样的语句。
#!/usr/bin/perl
package Foo;
sub bar {
print "Hello $_[0]\n"
}
sub blat {
print "World $_[0]\n"
}
1;
关于 Perl 模块的几个要点
require 和 use 函数将加载一个模块。
两者都使用 @INC 中的搜索路径列表来查找模块。
require和use函数都调用eval函数来处理代码。
底部的 1; 导致 eval 评估为 TRUE(因此不会失败)。
Require 函数
可以通过调用 require 函数来加载模块,如下所示 −
#!/usr/bin/perl
require Foo;
Foo::bar( "a" );
Foo::blat( "b" );
您一定已经注意到,子例程名称必须完全限定才能调用它们。 最好将子例程 bar 和 blat 导入到我们自己的命名空间中,这样我们就不必使用 Foo:: 限定符。
use 函数
可以通过调用 use 函数来加载模块。
#!/usr/bin/perl
use Foo;
bar( "a" );
blat( "b" );
请注意,我们不必完全限定包的函数名称。 use 函数将从模块中导出符号列表,给定模块内的一些添加语句。
require Exporter;
@ISA = qw(Exporter);
然后,通过填充名为 @EXPORT 的列表变量来提供符号列表(标量、列表、哈希、子例程等):例如 −
package Module;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);
sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" }
sub splat { print "Not $_[0]\n" } # Not exported!
1;
创建 Perl 模块树
当您准备好发布您的 Perl 模块时,就有一种创建 Perl 模块树的标准方法。 这是使用 h2xs 实用程序完成的。 该实用程序随 Perl 一起提供。 这是使用 h2xs 的语法 −
$h2xs -AX -n ModuleName
例如,如果您的模块在 Person.pm 文件中可用,则只需发出以下命令 −
$h2xs -AX -n Person
这将产生以下结果 −
Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST
这里是这些选项的描述 −
-A 省略了 Autoloader 代码(最好由定义大量不常用子例程的模块使用)。
-X 省略 XS 元素(eXternal 子例程,其中 eXternal 表示 Perl 外部,即 C)。
-n 指定模块的名称。
所以上面的命令在 Person 目录中创建了以下结构。 实际结果如上所示。
Changes
Makefile.PL
MANIFEST (包含包中所有文件的列表)
README
t/ (test files)
lib/ (实际源代码在这里)
所以最后,你 tar 这个目录结构到一个文件 Person.tar.gz 中,你就可以发布它了。 您必须使用正确的说明更新 README 文件。 您还可以在 t 目录中提供一些测试示例文件。
安装 Perl 模块
以 tar.gz 文件格式下载 Perl 模块。 使用以下顺序安装已下载为 Person.tar.gz 文件的任何 Perl 模块 Person.pm。
tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install
Perl 解释器有一个目录列表,它在其中搜索模块(全局数组@INC)。
❮ 上一节
下一节 ❯