- 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语句将当前命名上下文切换到指定的命名空间(符号表)。 如果指定的包不存在,则首先创建一个新的命名空间。
$i = 1; print "$i\n"; # Prints "1" package foo; $i = 2; print "$i\n"; # Prints "2" package main; print "$i\n"; # Prints "1"
包一直有效,直到调用另一个package语句,或者直到当前块或文件的结尾。
您可以使用::包限定符显式引用包内的变量。
$PACKAGE_NAME::VARIABLE_NAME For Example: $i = 1; print "$i\n"; # Prints "1" package foo; $i = 2; print "$i\n"; # Prints "2" package main; print "$i\n"; # Prints "1" print "$foo::i\n"; # Prints "2"
BEGIN和END块
您可以定义任意数量名为BEGIN和END的代码块,它们分别充当构造函数和析构函数。
BEGIN { ... } END { ... } BEGIN { ... } END { ... }
每个BEGIN块在Perl脚本加载和编译后但执行任何其他语句之前执行。
每个END块在Perl解释器退出之前执行。
BEGIN和END块在创建Perl模块时特别有用。
什么是Perl模块?
Perl模块是在库文件中定义的可重用包,其文件名与包名相同(以.pm结尾)。
名为“Foo.pm”的Perl模块文件可能包含如下语句。
#!/usr/bin/perl package Foo; sub bar { print "Hello $_[0]\n" } sub blat { print "World $_[0]\n" } 1;
关于模块的一些值得注意的要点
函数require和use将加载模块。
两者都使用@INC中的搜索路径列表来查找模块(您可以修改它!)。
两者都调用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 Module Name # For example, if your module is available in Person.pm file $h2xs -AX -n Person This will produce following result Writing Person/lib/Person.pm Writing Person/Makefile.PL Writing Person/README Writing Person/t/Person.t Writing Person/Changes Writing Person/MANIFEST
以下是这些选项的描述
-A省略自动加载器代码(最适合定义大量不常用子程序的模块)。
-X省略XS元素(外部子程序,其中外部表示Perl外部,即C)。
-n指定模块的名称。
因此,上面的命令在Person目录中创建以下结构。实际结果如上所示。
更改
Makefile.PL
MANIFEST(包含包中所有文件的列表)。
README
t/(测试文件)。
lib/(实际源代码放在这里)。
所以最终您将此目录结构打包到一个名为Person.tar的文件中,然后您可以发布它。您需要更新README文件,其中包含正确的说明。您可以在t目录中提供一些测试示例文件。
安装Perl模块
安装Perl模块非常简单。使用以下顺序安装任何Perl模块。
perl Makefile.PL make make install
Perl解释器有一个目录列表,它在其中搜索模块(全局数组@INC)。