您正在从Perl 5.14.1查看此文档的版本。查看最新版本

内容

名称

perlhack-如何破解Perl

描述

本文档解释了Perl开发的工作原理。它包括关于Perl5Porters电子邮件列表、Perl存储库、Perlbug错误跟踪器、补丁指南和Perl开发理念的评论的详细信息。

超级快速补丁指南

如果你只想提交一个小补丁,比如pod补丁、bug测试、评论补丁等等,那很容易!方法如下:

BUG报告

如果您想报告Perl中的错误,您必须使用珍珠贝命令行工具。此工具将确保您的错误报告包含所有相关的系统和配置信息。

要浏览现有的Perl错误和修补程序,可以在以下位置使用web界面:http://rt.perl.org/.

在提交错误报告之前,请检查perl5-porters列表(见下文)和/或错误跟踪系统的存档。通常,您会发现该错误已被报告。

您可以登录到缺陷跟踪系统并对现有的缺陷报告进行评论。如果您有关于现有错误的其他信息,请添加它。这将有助于搬运工修复错误。

PERL 5波特

perl5-porters(p5p)邮件列表是维护和开发Perl标准发行版的地方。维护Perl的人也被称为“Perl5搬运工”,或者只是“搬运工”。

列表的可搜索存档可在http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/。还有另一个存档位于http://archive.develooper.com/perl5-porters@perl.org网站/.

perl-changes邮件列表

perl5-changes邮件列表接收提交给perl存储库的维护和开发分支的每个补丁的副本。请参见http://lists.perl.org/list/perl5-changes.html获取订阅和存档信息。

获取PERL来源

Perl的所有源代码都集中保存在Git存储库中perl5.git.perl.org。该存储库包含从Perl 1开始的许多Perl修订版,以及以前版本控制系统Perforce的所有修订版。

有关在Perl存储库中使用git的更多详细信息,请参阅珍珠岩.

通过Git读取访问

您的计算机需要Git的副本。您可以使用git协议获取存储库的副本:

%git克隆git://perl5.git.perl.org/perl.git珍珠

这将克隆存储库并在珍珠目录。

如果由于防火墙原因无法使用git协议,也可以通过http进行克隆,但速度要慢得多:

%git克隆http://perl5.git.perl.org/perl.gitperl语言

通过web读取访问

您可以通过web访问存储库。这允许您浏览树、查看最近的提交、订阅RSS提要以获取更改、搜索特定提交等等。您可以访问http://perl5.git.perl.org/perl.git。存储库的镜像位于http://github.com/mirrors/perl.

通过rsync读取访问

您还可以选择使用rsync为bleadperl分支和所有维护分支获取当前源树的副本:

%rsync-avzrsync://perl5.git.perl.org/perl-current .%rsync-avzrsync://perl5.git.perl.org/perl-5.12.x .%rsync-avzrsync://perl5.git.perl.org/perl-5.10.x .%rsync-avzrsync://perl5.git.perl.org/perl-5.8.x .%rsync-avzrsync://perl5.git.perl.org/perl-5.6.x .%rsync-avzrsync://perl5.git.perl.org/perl-5.005xx .

(添加--删除选项删除剩余文件。)

要获取可用同步点的完整列表,请执行以下操作:

%rsync perl5.git.perl.org::

通过git进行写访问

如果您有提交位,请参阅珍珠岩有关使用git的更多详细信息。

修补PERL

如果您计划进行比单个小修复更广泛的工作,我们建议您阅读以下文档。这将帮助您集中精力工作,并使您的补丁更容易合并到Perl源代码中。

提交修补程序

如果你有一个小补丁需要提交,请通过perlbug提交。您也可以直接向发送电子邮件perlbug@perl.org。请注意,发送到perlbug的消息可能保存在审核队列中,因此您不会立即收到响应。

当您收到来自我们的票务跟踪系统的电子邮件时,您就会知道您的提交已被处理。这封电子邮件会给你一个票号。一旦您的补丁被发送到票证跟踪系统,它也将被发送到perl5-porters@perl.org列表。

补丁程序将在p5p列表中进行审查和讨论。使用简单、无争议的补丁时,通常不会进行任何讨论。应用修补程序后,票据将被更新,您将收到电子邮件。此外,将向p5p列表发送一封电子邮件。

在其他情况下,补丁需要更多的工作或讨论。这将发生在p5p列表上。

我们鼓励您参与讨论并为您的补丁进行宣传。有时候你的补丁可能会在洗牌中丢失。如果一个月内没有采取任何行动,可以向p5p发送一封提醒邮件。请记住,Perl 5开发人员都是志愿者,要有礼貌。

更改总是直接应用于主开发分支,称为“blead”。一些补丁可能会被后端口到维护分支。如果您认为您的补丁适合维护部门,请在提交时解释原因。

正在接受你的修补程序

如果您要提交一个代码修补程序,您可以做一些事情来帮助Perl5Porter接受您的修补程序。

面片样式

如果使用git检查Perl源代码,则使用git格式-补丁将以适合Perl的样式生成补丁。这个格式-补丁命令为您所做的每个提交生成一个修补程序文件。如果希望为所有提交发送单个补丁,可以使用差异比较.

%git合并出血%吉特拉力%git差异显示my-branch-name

这将根据blead和当前分支之间的差异生成补丁。在生成diff之前,确保blead是最新的,这很重要,这就是我们调用的原因吉特拉力第一。

如果可能,我们强烈建议您使用git。它会让你的生活更轻松,也会让我们的生活更容易。

然而,如果不使用git,仍然可以生成合适的补丁。您需要一个Perl源代码的原始副本来进行比较。搬运工更喜欢统一的差异。使用GNU差异,您可以生成如下差异:

%diff-Npurd perl.pristine perl.mine

确保您使真正干净在您的Perl副本中删除任何构建工件,否则可能会得到令人困惑的结果。

提交消息

在编写要提交给Perl内核的每个补丁时,编写一条好的提交消息很重要。如果您的提交将包含一系列提交,这一点尤其重要。

提交消息的第一行应该是不带句点的简短描述。它应该不超过电子邮件的主题行,50个字符是一个很好的经验法则。

许多Git工具(Gitweb、GitHub、Git-log--prett=oneline,…)在提交摘要时只显示第一行(在50个字符处截断)。

提交消息应包括对修补程序纠正的问题或修补程序添加的新功能的描述。

作为一般经验法则,您的提交消息应该有助于了解Perl核心的程序员快速理解您正在尝试做什么、如何尝试做,以及为什么更改对Perl很重要。

提交消息并不打算取代代码中的注释。提交消息应该描述所做的更改,而代码注释应该描述代码的当前状态。

如果您刚刚实现了一个新功能,包括文档、测试和注释良好的代码,那么一条简短的提交消息就足够了。然而,如果您只是在解析器或lexer中深层更改了一个字符,则可能需要编写一本小小说,以确保未来的读者理解您做了什么以及为什么要这样做。

评论、评论、评论

确保充分注释代码。虽然没有必要对每一行进行注释,但任何利用操作符副作用、在被修补的函数之外产生变化或其他人可能会感到困惑的内容都应记录在案。如果你要出错,最好是在添加太多评论的一边出错,而不是添加太少。

最好的评论解释为什么?代码做它做的事,而不是它做什么.

样式

一般来说,请遵循您正在修补的代码的特定样式。

特别是,请遵循以下通用准则来修补Perl源代码:

测试套件

如果您的补丁更改了代码(而不仅仅是更改文档),您还应该包括一个或多个测试用例,这些用例说明您正在修复的错误或验证您正在添加的新功能。通常,您应该更新现有的测试文件,而不是创建新的测试文件。

您的测试套件添加通常应遵循以下指南(由Gurusamy Sarathy提供<gsar@activestate.com>):

修补核心模块

这就像修补其他任何东西一样,需要额外考虑一点。

一些核心模块也位于CPAN上,并在Perl核心之外进行维护。当作者更新模块时,更新只是复制到核心中。

中的模块注册会计师/源树的目录是在Perl核心之外维护的。请参阅文档中该模块的列表或其在上的列表http://search.cpan.org/有关报告错误和提交修补程序的更多信息。

相比之下距离/目录保存在核心中。

更新perldelta

对于足以保证pod/perldelta.pod如果您在实际更改时提交一个delta条目,搬运工将非常感激。重大变化包括但不限于:

请确保将perldelta条目添加到pod/perldelta.pod。有关如何编写良好的perldelta条目的更多信息,请参阅样式第节,共节移植/how_to_write_a_perldelta.pod.

什么是好补丁?

该语言的新特性和扩展可能会引起争议。没有一组特定的标准来确定添加了哪些功能,但在开发修补程序时需要考虑以下问题:

这个概念符合Perl的总体目标吗?

我们的目标包括但不限于:

  1. 保持快速、简单和有用。

  2. 尽可能保持特性/概念正交。

  3. 没有任意限制(平台、数据大小、文化)。

  4. 在任何地方都可以使用/patch/ampository Perl,让它保持开放性和兴奋性。

  5. 要么吸收新技术,要么为它们搭建桥梁。

实施在哪里?

没有实现,世界上所有的谈论都是无用的。几乎在任何情况下,支持新功能的人都应该是实现它的人。能够编码新功能的搬运工有他们自己的日程安排,无法实现你的(可能是好的)想法。

向后兼容性

破坏现有的Perl程序是一大罪过。新的警告可能会引起争议——一些人说发出警告的程序没有被破坏,而另一些人则说是这样。添加关键字可能会破坏程序,更改现有标记序列或函数的含义可能会破坏节目。

Perl5核心包括一些机制,可以帮助移植程序使向后不兼容的更改更加兼容,例如特征反对模块。请在适当的时候使用它们。

可以改为模块吗?

Perl5具有扩展机制、模块和XS,特别是为了避免不断更改Perl解释器。你可以编写导出函数的模块,你可以给这些函数提供原型,这样它们就可以像内置函数一样被调用,如果你想实现真正复杂的东西,你甚至可以编写XS代码来扰乱Perl解释器的运行时数据结构。

只要有可能,新功能应该在CPAN模块中原型化,然后再考虑作为核心。

该功能是否足够通用?

这是只有提交者想要添加到语言中的东西吗,还是广泛有用?有时,搬运工可能会决定等到有人实现更通用的功能时再添加功能,而不是集中精力添加功能。

它是否可能引入新的错误?

彻底重写大量Perl解释器可能会引入新的错误。

它有多大?

更改越小、越本地化,效果越好。类似地,一系列小补丁比一个大补丁更受欢迎。

它是否排除了其他需要的功能?

如果一个补丁关闭了未来的发展途径,它很可能会被拒绝。例如,一个在原型上放置真实最终解释的补丁可能会被拒绝,因为对于原型的未来仍有一些选项尚未解决。

实施是否稳健?

好的补丁(严密的代码、完整的、正确的)更有可能被使用。松散或不正确的补丁可能被放在次要位置,直到泵有时间修复为止,或者可能在没有进一步通知的情况下被完全丢弃。

实现是否通用到可以移植?

最差的补丁程序使用系统特定的功能。Perl语言中不可移植的添加内容不太可能被接受。

实现是否经过测试?

改变行为(修复错误或引入新功能)的补丁必须包括回归测试,以验证一切是否如预期那样工作。

如果没有原始作者提供的测试,其他任何人在将来更改perl时如何确保他们没有无意中破坏补丁实现的行为?如果没有测试,补丁的作者怎么能确信他/她的辛勤工作在补丁中不会在将来被人意外抛弃?

有足够的文件吗?

没有文档的补丁可能是考虑不周或不完整的。没有文档就不能添加或更改任何功能,因此为相应的pod文档和源代码提交补丁非常重要。

还有别的方法吗?

拉里说:“尽管Perl口号是有多种方法“我不太愿意用10种方法去做某事”。不过,这是一个很难驾驭的启发式方法——一个人的重要补充是另一个人的无用之物。

它创造了太多的工作吗?

为泵工作,为Perl程序员工作,为模块作者工作。。。Perl应该很容易。

补丁胜于雄辩

工作代码总是比pie-in-the-sky想法更受欢迎。与随机功能请求相比,添加功能的补丁更有可能被添加到语言中,无论请求有多么激烈。这与“它有用吗?”联系在一起,因为有人花时间制作补丁的事实表明了对该功能的强烈渴望。

测试

核心使用与Perl其余部分相同的测试风格,即简单的“ok/not-ok”贯穿Test::Harness,但有一些特殊的注意事项。

在核心中编写测试有三种方法。测试::更多,t/测试.pl和临时打印$test?“ok 42\n”:“不正常42\n”。使用哪个测试套件的决定取决于您正在使用的测试套件的哪个部分。这是一种防止高级故障(例如Config.pm中断)导致基本功能测试失败的措施。

这个t/测试.pl库提供了以下功能测试::更多,但避免加载大多数模块,并使用尽可能少的核心功能。

如果您编写自己的测试,请使用测试任何协议.

当您说“make test”时,Perl使用t/测试用于运行测试套件的程序(在Win32下使用的除外t/线束相反)。所有测试都从t吨/目录,包含测试的目录。这会导致中的测试出现一些问题图书馆/,所以这里有一些修补的机会。

您必须三倍地意识到跨平台问题。这通常归结为使用文件::规范并避免类似的事情叉子()系统()除非绝对必要。

特殊进行测试目标

有各种特殊的make目标可用于测试Perl,与标准的“test”目标略有不同。并不是所有人都能达到100%的成功率。其中许多具有多个别名,其中许多别名在某些操作系统上不可用。

平行测试

核心发行版现在可以在类Unix平台上并行运行回归测试。而不是跑步进行测试,套测试_作业在您的环境中,要并行运行的测试数量制作测试线束。在一个类似Bourne的外壳上,可以这样做

TEST_JOBS=3使TEST_线束#并行运行3个测试

使用环境变量,而不是并行生成本身,因为TAP::线束需要能够调度单个非冲突测试脚本本身,并且没有标准接口来制作实用程序与作业调度程序交互。

注意,当前一些测试脚本在并行运行时可能会失败(最显著的是下一个/IO/t/IO_dir.t). 如有必要,只需按顺序再次运行出现故障的脚本,并查看故障是否消失。

手动运行测试

您可以通过使用来自t吨/目录:

./perl-I./lib TEST列表-.t-files

./perl-I./lib线束列表-.t-files

(如果不指定测试脚本,则将运行整个测试套件。)

使用t/线束用于测试

如果您使用马具对于测试,您有几个可用的命令行选项。参数如下所示,并且按照它们在一起使用时必须出现的顺序排列。

harness-v-track-re=要测试的文件的模式列表挽具-v-酷刑-重新列出要匹配的图案

如果要测试的文件列表则从清单中获取文件列表。文件列表可能包含将展开的shell通配符。

您可以通过类似以下命令运行单个测试

./perl-I../lib路径/to/foo。t吨

但线束设置了一些可能影响测试执行的环境变量:

可能影响测试的其他环境变量

有关影响测试的更多环境变量,请参阅测试和测试:线束模块的文档。

更多关于肠胃病患者的阅读

要攻击Perl内核,您需要阅读以下内容:

CPAN测试仪和PERL吸烟者

CPAN测试人员(网址:http://testers.cpan.org/)是一组志愿者,他们在各种平台上测试CPAN模块。

Perl吸烟者(http://www.nntp.perl.org/group/perl.daily-build/http://www.nntp.perl.org/group/perl.daily-build.reports/)在具有各种配置的平台上自动测试Perl源代码版本。

这两项努力都欢迎志愿者。为了参与perl本身的烟雾测试,请访问http://search.cpan.org/dist/Test-Smoke网站/为了开始烟雾测试CPAN模块,请访问http://search.cpan.org/dist/CPANPLUS-YACSmoke网站/http://search.cpan.org/dist/minismokebox/http://search.cpan.org/dist/cpan-Reporter网站/.

下一步怎么办?

如果您已经阅读了文档中的所有文档以及上面列出的文档,那么您已经做好了破解Perl的准备。

这里还有一些建议

“这条路从它开始的那扇门一直延伸下去。”

如果您能做到这些,那么您已经开始了Perl移植的漫长道路。感谢您想帮助改进Perl,并让它变得更快乐!

隐喻引语

如果你能认出上面关于这条路的引述,那你就很幸运了。

大多数软件项目以每个文件的用途的文字描述作为每个文件的开头。相反,Perl以一个文学典故开始每个文件。

与许多书籍中的章节一样,所有顶级Perl源文件(以及其他一些文件)都以一个警句开头,间接地和隐喻地暗示您将要阅读的材料。

引用自J.R.R.托尔金关于他的传奇故事的著作,几乎总是来自指环王.章节和页码使用以下版本给出:

因此,其他JRRT图书的公平报价游戏将包括汤姆·邦巴迪尔历险记,精灵宝钻,未完成的故事、和胡林孩子的故事除了CJRT在死后组装的第一个外,其他都是。但是指环王它本身很好,如果你能在那里找到合适的报价,可能是最好的报价。

因此,如果您要提供一个新的、完整的顶级源文件来添加到Perl中,您应该遵循这种特殊的做法,从Tolkien中选择一个合适的引号,保留原来的拼写和标点,并使用与其余引号相同的格式;记住,这是一个隐喻,所以成为元毕竟是为了什么。

作者

本文档最初由Nathan Torkington编写,由perl5-porters邮件列表维护。