- Perl 基础
- Perl - 首页
- Perl - 简介
- Perl - 环境
- Perl - 语法概述
- Perl - 数据类型
- Perl - 变量
- Perl - 标量
- Perl - 数组
- Perl - 哈希
- Perl - IF...ELSE
- Perl - 循环
- Perl - 运算符
- Perl - 日期和时间
- Perl - 子程序
- Perl - 引用
- Perl - 格式
- Perl - 文件 I/O
- Perl - 目录
- Perl - 错误处理
- Perl - 特殊变量
- Perl - 编码规范
- Perl - 正则表达式
- Perl - 发送邮件
- Perl 高级
- Perl - 套接字编程
- Perl - 面向对象
- Perl - 数据库访问
- Perl - CGI 编程
- Perl - 包和模块
- Perl - 进程管理
- Perl - 嵌入式文档
- Perl - 函数引用
- Perl 有用资源
- Perl - 问题和解答
- Perl - 快速指南
- Perl - 有用资源
- Perl - 讨论
Perl - 包和模块
什么是包?
package 语句将当前命名上下文切换到指定的命名空间(符号表)。因此 -
包是存在于其自身命名空间中的一组代码。
命名空间是唯一变量名称的命名集合(也称为符号表)。
命名空间防止包之间发生变量名称冲突。
包允许构建模块,这些模块在使用时不会覆盖模块自身命名空间之外的变量和函数。
包一直有效,直到调用另一个 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 元素(外部子程序,其中外部表示 Perl 之外,即 C)。
-n 指定模块的名称。
因此,以上命令在 Person 目录中创建以下结构。上面显示了实际结果。
- 更改
- Makefile.PL
- MANIFEST(包含包中所有文件的列表)
- README
- t/(测试文件)
- lib/(实际源代码放在这里)
所以最终,您将此目录结构打包到文件 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)。