编写 PERL 模块

什么是包?

  • 包是位于其自己的命名空间中的代码集合

  • 命名空间是唯一变量名的命名集合(也称为符号表)。

  • 命名空间防止包之间的变量名冲突

  • 包支持构建模块,使用时不会破坏模块自己的命名空间之外的变量和函数


package 包声明

  • 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_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;

关于模块的几个值得注意的点

  • requireuse 函数将加载一个模块。

  • 两者都使用 @INC 中的搜索路径列表来查找模块(您可以修改它!)

  • 都调用eval函数来处理代码

  • 底部的 1; 导致 eval 评估为 TRUE(因此不会失败)


需求函数

可以通过调用 require 函数来加载模块

#!/usr/bin/perl

require Foo;

Foo::bar( "a" );
Foo::blat( "b" );

请注意上面的子程序名称必须是完全限定的(因为它们被隔离在自己的包中)

最好将函数 bar 和 blat 导入到我们自己的命名空间中,这样我们就不必使用 Foo:: 限定符。


使用函数

可以通过调用use函数来加载模块

#!/usr/bin/perl

use Foo;

bar( "a" );
blat( "b" );

注意我们不必完全限定包的函数名称?

使用函数将从模块中导出符号列表,给定模块内的一些添加语句

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 省略 Autoloader 代码(最好由定义大量不常用子例程的模块使用)

  • -X 省略 XS 元素(eXternal 子例程,其中 eXternal 表示 Perl 外部,即 C)

  • -n 指定模块的名称

所以上面的命令在 Person 目录中创建了以下结构。 实际结果如上所示。

  • Changes

  • Makefile.PL

  • MANIFEST (包含包中所有文件的列表)

  • README

  • t/ (测试文件)

  • lib/ (实际源代码在这里)

所以最后你把这个目录结构tar 放到一个文件Person.tar 中,然后你就可以发布它了。 您必须使用正确的说明更新 README 文件。 您可以在 t 目录中提供一些测试示例文件。


安装 Perl 模块

安装 Perl 模块非常简单。 使用以下顺序安装任何 Perl 模块。

perl Makefile.PL
make
make install

Perl 解释器有一个目录列表,它在其中搜索模块(全局数组 @INC)