Perl 发行版、模块、包解释

对于新的 Perl 程序员来说,理解描述 Perl 发行版及其相关文件的术语可能有些令人困惑。本文解释了核心概念。

包、模块、发行版

Perl 包只是定义在 .pm 文件中的一个代码部分,如下所示

package Data::Connector;

sub connect {
    # do something
    ...
}
1;

包的起始部分以“package”声明开始。包很像一个类,除了它可以表示一个子例程和变量的集合,并不一定需要实例化为对象。通常,.pm 文件中会有一份包声明,但你可以在一个 .pm 文件中有多个包,类似于 Java 和 C#,你可以在一个文件中拥有多个类。

模块是一个 .pm 文件(“pm”代表 Perl Module)。当你使用“require”或“use”导入模块时,你实际上是在引用文件名,而不是文件中的包。例如,为了导入上面定义的“Data::Connector”包,我们可以将其保存为名为“Whatever.pm”的文件,并在脚本中如下引用它

use Whatever;

# call connect subroutine declared in Data::Connector package
Data::Connector::connect();

所有 .pm 文件都必须按照 Perl 的要求以“true”值结束,因此大多数作者要么在 .pm 文件的最后一行放置“1;”或“__PACKAGE__;”,在 Perl 中,true 值是任何非 null、零或空字符串的值。

发行版是一组文件,通常包括一个 Perl 模块和几个其他文件。没有严格的标准来规定必须包含哪些文件,然而,为了使发行版能够在 CPAN 上索引并由 CPAN 命令行客户端安装,发行版需要包含一些核心文件。发行版有版本号——因此 CPAN 上的每个 Perl 模块都有一个针对该模块每个版本的发行版。这些是在发行版中遇到的主要文件和目录

  • README - 对如何安装发行版的简要描述,有时包括许可证和使用模块的示例。
  • LICENSE - 代码的许可证——如 GPL、艺术、BSD 等非商业许可证很常见。
  • META.yml/META.json - 包含描述发行版的元数据的文件:作者、许可证、版本、使用前必需的模块等。它们是作为发行版构建过程的一部分自动生成的,可以忽略。
  • Makefile.PL 和或 Build.PL - 这些是用于在发行版中安装模块的 Perl 文件。当遇到安装问题时,值得查看这些文件。
  • MANIFEST - 包含在发行版中的文件列表。
  • lib - 包含 Perl 模块的目录——通常是发行版的核心代码。
  • t - 测试文件目录。当模块安装时将运行这些文件。如果安装时测试失败,查看 t/ 目录中的测试文件可以帮助找到测试的具体细节。
  • bin - 如果发行版包含应用程序(Perl 脚本),它将在这里。通常应用程序使用 lib 目录中的模块。
  • Changes - 从发行版版本到版本的更改列表。
  • xt - 扩展测试文件目录,通常用于不需要运行的作者测试。
  • eg - 示例 Perl 脚本目录,使用发行版中的模块。

这些都是 Perl 发行版中发现的典型目录和文件,但由于没有固定标准,发行版作者可以自由地包含和排除他们希望包含的文件。作为一个好例子,可以查看 David Golden 在流行的 HTTP::Tiny 模块发行版中提供的文件。

结论

一旦你掌握了Perl的包、模块和分发,那么开始修改那些不符合你预期的Perl模块就会容易得多。例如,对于一个无法安装的模块,你可以从CPAN(在命令行中“cpan -g Module::Name”)下载分发版本,解压它,修复失败的测试,或者检查lib目录中的源代码,解决一些bug。不久之后,你将能够将你自己的分发版本发布到CPAN上!

喜欢这篇文章吗?请帮助我们,分享到Twitter吧!


这篇文章最初发表在PerlTricks.com上。

标签

David Farrell

David是一位专业程序员,他经常在Twitter上在博客上分享关于代码和编程艺术的文章。

浏览他们的文章

反馈

这篇文章有什么问题吗?请通过GitHub提交问题或拉取请求来帮助我们。