编写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;

关于模块的一些值得注意的要点

  • 函数requireuse将加载模块。

  • 两者都使用@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)。

广告