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 模块的几个要点

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

  • 两者都使用@INC中的搜索路径列表来查找模块。

  • requireuse两个函数都调用eval函数来处理代码。

  • 1 底部导致 eval 计算结果为 TRUE(因此不会失败)。

需求函数

可以通过调用require函数来加载模块,如下所示 -

#!/usr/bin/perl

require Foo;

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

您一定已经注意到,子例程名称必须完全限定才能调用它们。最好能够将子例程barblat导入到我们自己的命名空间中,这样我们就不必使用 Foo:: 限定符。

使用功能

可以通过调用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省略自动加载器代码(最好由定义大量不常用子例程的模块使用)。

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

  • -n指定模块的名称。

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

  • 变化
  • 生成文件.PL
  • MANIFEST(包含包中所有文件的列表)
  • 自述文件
  • t/(测试文件)
  • lib/(实际源代码在这里

最后,您将此目录结构压缩到文件 Person.tar.gz 中,然后就可以发送它了。您必须使用正确的说明更新自述文件。您还可以在 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)。