当前位置: 首页 > 文档资料 > Perl 入门教程 >

Perl Modules

优质
小牛编辑
128浏览
2023-12-01

什么是包裹?

  • 包是一组代码,它们位于自己的命名空间中

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

  • 命名空间可防止包之间发生变量名冲突

  • 软件包可以构建模块,这些模块在使用时不会破坏模块自身命名空间之外的变量和函数

The 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限定符显式引用包中的变量

<b>$PACKAGE_NAME::VARIABLE_NAME</b>
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解释器退出之前执行。

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

什么是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 :: qualifier。

使用功能

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

#!/usr/bin/perl
use Foo;
bar( "a" );
blat( "b" );

请注意,我们没有必要完全限定包的函数名称?

use函数将在模块内部添加一些语句的情况下从模块中导出符号列表

require Exporter;
@ISA = qw(Exporter);

然后,通过填充名为@EXPORT的列表变量@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 Subroutine,其中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)