软件包和模块(Packages & Modules)
什么是包裹?
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解释器退出之前执行。
创建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的包的名称相同。
名为Foo.pm Perl模块文件可能包含这样的语句。
#!/usr/bin/perl
package Foo;
sub bar {
print "Hello $_[0]\n"
}
sub blat {
print "World $_[0]\n"
}
1;
关于Perl模块的几点重要
函数require和use将加载一个模块。
两者都使用@INC中的搜索路径列表来查找模块。
这两个函数require并use调用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 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指定模块的名称。
因此上面的命令在Person目录中创建以下结构。 实际结果如上所示。
- Changes
- Makefile.PL
- MANIFEST(包含包中所有文件的列表)
- README
- t /(测试文件)
- lib /(实际源代码在这里
最后,您将此目录结构转换为文件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)。