Perl - 包和模块

什么是包?

语句将当前命名上下文切换到指定的命名空间(符号表).因此 :

  • 包是一个代码集合,它存在于自己的命名空间中.

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

  • 命名空间阻止变量包之间的名称冲突.

  • 包启用了模块的构造,这些模块在使用时不会破坏模块自身命名空间之外的变量和函数.

  • 在调用另一个包语句或直到当前块或文件结束之前,包保持有效.

  • 您可以使用 :: 包限定符显式引用包中的变量.

以下是在文件中包含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解释器退出之前执行.

  • 创建Perl模块时,BEGIN和END块特别有用.

以下示例显示其用法:

#!/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的软件包名称相同.

Perl模块名为 Foo.pm 的文件可能包含这样的语句.

#!/usr/bin/perl

package Foo;
sub bar { 
   print "Hello $_[0]\n" 
}

sub blat { 
   print "World $_[0]\n" 
}
1;


关于Perl模块的几点重要

  • 函数需要使用将加载模块.

  • 两者都使用搜索路径列表 @INC 找到该模块.

  • 两个函数需要使用调用 eval 函数来处理代码.

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

需要函数

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

#!/usr/bin/perl

require Foo;

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


您必须注意到子程序名称必须完全限定才能调用它们.将子例程 bar blat 导入我们自己的命名空间会很好,所以我们不必使用Foo :: qualifier.

使用函数

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

#!/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&minus的语法;

$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元素(eXternal Subroutine,其中eXternal意味着Perl外部,即C).

  • -n 指定n模块的ame.

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

  • 更改

  • Makefile.PL

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

  • 自述文件

  • t/(测试文件)

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

最后,你 tar 这个目录结构进入一个文件Person.tar.gz你可以发货.你必须用正确的说明更新README文件.你也可以在t目录中提供一些测试样例文件.

安装Perl模块

以tar.gz文件的形式下载Perl模块.使用以下序列安装任何已下载的Perl模块 Person.pm Person.tar.gz 文件.

tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install


Perl解释器有一个目录列表,用于搜索模块(全局排列@INC).