珀尔
![]() | |
范例 | 多范式 |
---|---|
设计 | 拉里·沃尔(Larry Wall) |
开发人员 | 拉里·沃尔(Larry Wall) |
首先出现 | 1987年12月18日 |
稳定版本 |
|
预览发布 | 5.39.5 / 20 2023年11月20日 |
打字学科 | 动态的 |
实施语言 | C |
作业系统 | 跨平台 |
执照 | 艺术许可1.0或GNU通用公共许可证版本1或任何后期版本 |
文件名扩展 | .plx,.pl,.pm,.xs,.t,.pod,.cgi |
网站 | perl.org |
被影响 | |
尴尬,基本, C , C ++ , LISP , SED , UNIX Shell | |
受影响 | |
Coffeescript , Groovy , JavaScript , Julia , LPC , PHP , Python , Raku , Ruby , PowerShell | |
|
Perl是一种高级,通用的,解释的,动态的编程语言。尽管Perl不是正式的首字母缩写词,但使用了各种露天号,包括“实用提取和报告语言”。
Perl由Larry Wall于1987年作为通用Unix脚本语言开发,以使报告处理更加容易。从那以后,它发生了许多变化和修订。 Perl最初没有大写,该名称被更改为Perl 4发布时被大写的。最新版本是Perl 5,于1994年首次发布。从2000年到2019年10月,Perl的第六版正在开发,然后在后者的名称正式更改为Raku之前。两种语言继续由不同的开发团队独立开发,这些发展团队彼此自由地借鉴思想。
Perl借用了其他编程语言的功能,包括C , SH , AWK和SED 。它提供文本处理设施,而没有许多当代UNIX命令行工具的任意数据长度限制。 Perl是一种高度表达的编程语言:给定算法的源代码可以简短且高度可压缩。
佩尔(Perl)在1990年代中期作为CGI脚本语言获得了广泛的知名度,部分原因是其强大的正则表达和弦乐解析能力。除CGI外,Perl 5还用于系统管理,网络编程,金融,生物信息学和其他应用程序,例如GUIS 。由于其灵活性和力量,它被暱称为“瑞士军电锯”。在1998年,它也被称为“将互联网融合在一起的胶带”,它是指它无处不在用作胶水语言及其可感知的含量。
名称和徽标
佩尔最初被命名为“珍珠”。沃尔想给语言一个带有正面含义的简短名称。这也是基督教对马修福音的寓言的提及。但是,沃尔在佩尔(Perl)正式发行之前发现了现有的珍珠编程语言,并更改了名称的拼写,并从名称中删除了“ a”。
该名称偶尔会以倒数义来扩展:实用提取和报告语言以及Wall自己的病理性垃圾Lister ,这是Perl的手册页中。
由O'Reilly Media出版的编程Perl在封面上发表了一张引人注目的骆驼的图片,通常称为“骆驼书”。该图像已成为Perl的非正式象征以及一般黑客标志,出现在T恤和其他服装上。 O'Reilly将图像作为商标拥有,但为非商业使用许可,仅需要确认和链接到www.perl.com。商业用途的许可是根据具体情况决定的。 O'Reilly还为非商业网站提供“ Perl Republic of Perl共和国”徽标,并为使用Perl的任何站点提供“由Perl”按钮。
Perl基金会拥有一个替代符号,一种洋葱,它可以将其许可给其子公司, Perl Mongers , Perlmonks ,Perl.org等。该符号是珍珠洋葱的视觉双关语。
Mojolicious的创建者Sebastian Riedel创建了一个徽标,描绘了猛禽恐龙,该徽标可根据CC-SA许可(版本4.0版)获得。猛禽的类似物来自马特·鳟鱼从2010年开始的一系列演讲。
历史
早期版本
拉里·沃尔(Larry Wall)于1987年开始在佩尔(Perl)工作,同时曾在Unisys担任程序员。他于1987年12月18日发布了1.0版。
Perl的早期语言基于墙的使用是使用有助于文本操纵的现有语言。
Perl 2于1988年6月发行,具有更好的正则表达引擎。 Perl 3于1989年10月发布,增加了对二进制数据流的支持。
1990年代
最初,Perl的唯一文档是一个冗长的人页面。 1991年,由于其封面而被许多Perl程序员称为“骆驼书”的编程Perl出版了,并成为该语言的事实上的参考。同时,Perl版本号被撞到4,而不是标志着该语言的重大变化,而是要确定本书已有文献记录的版本。 Perl 4于1991年3月发布。
Perl 4经过了一系列的维护版本,最终在1993年的Perl 4.036中达到了最终,因此墙抛弃了Perl 4,开始在Perl 5上工作5. Perl 5的初始设计一直持续到1994年。Perl5- Porters邮寄清单是在1994年5月建立的。协调将Perl 5移植到不同平台的工作。它仍然是Perl 5的开发,维护和移植的主要论坛。
Perl 5.000于1994年10月17日发布。它几乎是对口译员的几乎完整的重写,它为该语言添加了许多新功能,包括对象,参考,词汇(MY)变量和模块。重要的是,模块提供了一种扩展语言的机制,而无需修改解释器。这使核心解释器能够稳定,即使它使普通的Perl程序员能够添加新的语言功能。从那以后,Perl 5一直处于积极发展。
Perl 5.001于1995年3月13日发布。Perl5.002于1996年2月29日发布,其新原型功能。这使模块作者能够制作出像perl内置的子例程。 Perl 5.003于1996年6月25日发布,作为安全发布。
Perl 5历史上最重要的事件之一是在适当的语言之外发生的,这是其模块支持的结果。 1995年10月26日,综合的Perl档案网络(CPAN)被建立为Perl语言和Perl模块的存储库;截至2022年12月,它在43,865个发行版中载有211,850多个模块,由14,324多个作者撰写,并在245多个地点遍布全球。
Perl 5.004于1997年5月15日发布,其中包括通用软件包,为Perl提供了一个基本对象,所有类都是自动得出所有类的基本对象,并且具有需要版本的模块的能力。另一个重大的发展是包含CGI.PM模块,这导致了Perl作为CGI脚本语言的知名度。
Perl 5.004添加了对Microsoft Windows , Plan 9 , QNX和Amigaos的支持。
Perl 5.005于1998年7月22日发布。此版本包括Regex Engine的几种增强功能,通过The New Hooks通过B::*
模块,qr//
Regex Quote Operator,许多其他新的核心模块选择,并为包括Beos在内的更多操作系统提供了支持。
2000–2020
主要版本 | 最新更新 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
5.4 | 1999-04-29 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.5 | 2004-02-23 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.6 | 2003-11-15 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.8 | 2008-12-14 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.10 | 2009-08-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.12 | 2012-11-10 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.14 | 2013-03-10 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.16 | 2013-03-11 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.18 | 2014-10-01 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.20 | 2015-09-12 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.22 | 2017-07-15 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.24 | 2018-04-14 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.26 | 2018-11-29 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.28 | 2020-06-01 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.30 | 2020-06-01 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.32 | 2021-01-23 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.34 | 2023-11-29 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.36 | 2023-11-29 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.38 | 2023-11-29 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
旧版 较旧的版本,仍然保持 当前稳定版本 最新的预览版 未来发布 |
Perl 5.6于2000年3月22日发布。重大更改包括64位支持, Unicode字符串表示,对2 GIB的文件支持以及“我们的”关键字。在开发Perl 5.6时,决定将版本控制方案转换为与其他开源项目类似的一种。在5.005_63之后,下一个版本变为5.5.640,开发版本的计划具有奇数和稳定版本的数字。
2000年,沃尔(Wall)呼吁向社区的新版本Perl提出建议。该过程产生了361个RFC(请求评论)文档,这些文档将用于指导Perl 6的开发6。2001年,Perl 6的“启示录”开始了工作,这是一系列旨在汇总变更请求并存在的文档下一代Perl的设计。它们是作为RFC的摘要而不是正式文档提出的。在这一点上,Perl 6仅作为对语言的描述存在。
Perl 5.8于2002年7月18日首次发布,此后每年大约发布了5.x版本。 Perl 5.8改进的Unicode支持,添加了新的I/O实现,添加了新的线程实现,提高了数字精度并添加了几个新模块。截至2013年,此版本仍然是Perl的最受欢迎版本,并由Red Hat 5,Suse 10,Solaris 10,HP-UX 11.31和AIX 5使用。
2004年,“概述”开始了工作 - 最初总结了启示录的文档,但成为Perl 6语言的规范。 2005年2月,奥黛丽·唐(Audrey Tang)开始在哈斯克尔( Haskell)撰写的Perl 6口译员Pugs上工作。这是使Perl 6成为现实的第一个协同努力。这项努力在2006年停滞不前。
Ponie是新内部发动机上Perl的首字母缩写。 PONIE项目从2003年到2006年存在,是Perl 5和Perl 6之间的桥梁。这是为了重写Perl 5解释器以在Perl 6虚拟机上运行的Perl 5解释器。目的是确保全球成千上万公司的数百万Perl 5代码的未来。 Ponie项目于2006年结束,不再积极发展。作为Ponie的一部分,对Perl 5解释器进行的一些改进被折叠成该项目。
2007年12月18日,Perl 1.0成立20周年,Perl 5.10.0发布。 PERL 5.10.0包含了显著的新功能,使其更接近Perl6。其中包括一个开关语句(称为“给定”/“何时”),正则表达式更新和智能匹配操作员(~~) 。大约在同一时间,开发始于另一个被称为Rakudo Perl的Perl 6实施,该实施与Parrot Virtual Machine一起开发。截至2009年11月,Rakudo Perl已定期每月发布,现在是Perl 6的最完整实施。
Perl 5.11发生了Perl 5的开发过程的重大变化;开发界已改用开发版本的每月发行周期,并具有年度稳定版本的时间表。根据该计划,BugFix点发布将遵循每三个月稳定的发布。
2010年4月12日,Perl 5.12.0发布。值得注意的核心增强功能包括新的package NAME VERSION
Yada Yada运营商语法(旨在标记尚未实施的占位符代码),隐式狭窄,完整的Y2038合规性,Regex转换重载, Dtrace支持和Unicode 5.2。
2011年5月14日,Perl 5.14与内置JSON支持发行。
2012年5月20日,Perl 5.16发布。值得注意的新功能包括能够指定一个人希望效仿的给定版本的Perl,允许用户升级其版本的Perl,但仍运行通常不兼容的旧脚本。 Perl 5.16还更新核心以支持Unicode 6.1。
2013年5月18日,Perl 5.18发布。值得注意的新功能包括新的Dtrace钩子,词汇量,更多核心:: subs,出于安全原因大修,支持Unicode 6.2。
2014年5月27日,Perl 5.20发布。值得注意的新功能包括子例程签名,哈希片/新切片语法,后缀删除(实验),Unicode 6.3和使用一致的随机数生成器。
一些观察家将Perl 5.10的发布归功于现代Perl运动的开始。特别是,该短语描述了一种涵盖CPAN使用,利用该语言的最新发展的开发方式,并且在创建高质量代码方面非常严格。虽然“现代佩尔”一书可能是该想法中最明显的标准品,但诸如开明的佩尔组织等其他群体也承担了这一事业。
在2012年底和2013年,Perl 5的替代实施项目开始:rakudo Perl团队的Perl5在Perl6中,Stevan Little和朋友的Moe , P2由Reini Urban的Perl11团队, Goccy的GPERL和RPERL,REPERL,Kickstarter, Kickstarter由威尔·布拉斯韦尔(Will Braswell)领导的项目,隶属于Perll11项目。
Perl 6和Raku

在2000年的Perl会议上,乔恩·奥旺特(Jon Orwant)为主要的新语言定位提供了理由。这导致决定开始重新设计该语言的工作,被称为Perl 6。
沃尔在接下来的几年中消化了RFC,并将它们合成为Perl 6的连贯框架。截至2011年1月,Perl 6的开发规范已封装在称为主题的设计文档中,编号为对应于启示录。
Bradley M. Kuhn的论文作品是由Wall监督的,它考虑了将Java虚拟机作为Perl的运行时间的使用。库恩的论文表明这种方法是有问题的。在2001年,决定Perl 6将在称为Parrot的跨语言虚拟机上运行。这将意味着针对鹦鹉的其他语言将获得对CPAN的本地访问权限,从而允许一定程度的跨语言开发。
2005年,奥黛丽·唐(Audrey Tang)创建了帕格(Pugs)项目,这是哈斯克尔( Haskell)的Perl 6的实现。这充当并继续充当Perl 6语言的测试平台(与实际实现的开发不同) - 允许语言设计师探索。 PUGS项目催生了一个活跃的Perl/Haskell跨语言社区,以Libera Chat #Raku IRC频道为中心。 Perl 6设计团队吸收了许多功能编程的影响。
2012年,Perl 6开发主要集中在两个编译器上:
2013年, Moarvm (“运行时的metamodel”),宣布了主要为Rakudo设计的基于C语言的虚拟机。
2019年10月,Perl 6更名为Raku。
截至2017年,只有Rakudo实施和MOARVM正在积极开发中,并且支持其他虚拟机,例如Java Virtual Machine和JavaScript 。
佩尔7
2020年6月,Perl 7宣布为Perl 5的继任者。Perl7最初是基于Perl 5.32,预计在2021年上半年发布,并尽快发布候选人。
该计划于2021年5月进行了修订,没有任何发布时间范围或版本的Perl 5作为指定的基线。释放Perl 7时,Perl 5将进行长期维护。但是,受支持的Perl 5版将继续获得重要的安全性和错误修复。
Perl 7于2020年6月24日在“云的Perl Conference in the Cloud”中宣布为Perl 5的继任者。基于Perl 5.32,Perl 7的计划与Modern Perl 5代码兼容; perl 5代码,无样式板(PRAGMA)标头需要添加use compat::perl5;
保持兼容,但是现代代码可以放下一些样板。
但是,前往Perl 7的计划提出了更多的讨论,而Perl指导委员会取消了它,以避免对未写给布拉格马斯的脚本的向后兼容性问题,而这些脚本和将成为Perl 7的默认值仅当开发人员添加足够的功能以保证重大释放升级时出来。
设计
哲学
根据沃尔的说法,佩尔有两个口号。第一个是“有多种方法可以做到”,通常称为Tmtowtdi(发音为蒂姆·托迪( Tim Toady ))。正如这个座右铭的支持者所说的那样,这种哲学使得写简洁的陈述变得容易。
第二个口号是“简单的事情应该很容易,应该可能的事情应该是可能的”。
Perl的设计可以理解为对计算机行业中三个广泛趋势的回应:硬件成本下降,人工成本的上升以及编译器技术的改进。许多早期的计算机语言,例如Fortran和C,旨在有效利用昂贵的计算机硬件。相比之下,Perl的设计是为了使计算机程序员可以更快,更轻松地编写程序。
Perl具有许多功能,可以以更大的CPU和内存要求为代价来简化程序员的任务。这些包括自动内存管理;动态键入;字符串,清单和哈希;常用表达;内省;和eval()
功能。佩尔遵循“无内置限制”的理论,这个想法类似于零一个无限规则。
沃尔(Wall)被训练为语言学家,而佩尔(Perl)的设计非常受到语言原则的了解。示例包括霍夫曼编码(常见的结构简短),良好的终端加权(重要的信息应该先出现)以及大量的语言原则。佩尔(Perl)有利于人类简洁明了的语言构造,即使在使Perl解释器复杂化的地方。
佩尔的语法反映了“不同的事物看起来不同”的想法。例如,标量,阵列和哈希具有不同的领先sigils。数组索引和哈希键使用不同种类的牙套。字符串和正则表达式具有不同的标准定界符。这种方法可以与诸如LISP之类的语言形成鲜明对比,在该语言中,由简单和通用符号表达式组成的相同基本语法用于所有目的。
Perl语言和围绕它的社区和文化都有广泛的实践性。 Perl编程的序言开始:“ Perl是一种完成工作的语言。”结果之一是,Perl不是一种整洁的语言。它包括许多功能,可容忍其规则的例外,并采用启发式方法来解决句法歧义。由于编译器的宽容性质,有时很难找到错误。 Perl的功能文档在列表和标量上下文中内置函数的变化行为说:“一般而言,除非您想要一致性,否则他们会做您想要的。”
特征
Perl的总体结构广泛源自C. Perl本质上是程序性的,具有变量,表达式,分配说明,支撑式块,控制结构和子例程。
Perl还采用了Shell编程的功能。所有变量均标有前导sigils ,允许将变量直接插入字符串中。但是,与Shell不同,Perl在所有访问变量上都使用Sigils,与使用Sigils的大多数其他编程语言不同,Sigil并不表示变量的类型,而是表达式的类型。因此,例如,虽然阵列用sigil“@”表示(例如@arrayname
),阵列的个别成员用标量sigil“ $”表示(例如$arrayname[3]
)。 Perl还具有许多内置功能,这些功能提供了经常在Shell编程中使用的工具(尽管其中许多工具是由外壳外部的程序实现的),例如排序和调用操作系统设施。
Perl从尴尬和SED的正则表达式中拿出哈希(“关联阵列”)。这些简化了许多解析,文本处理和数据管理任务。与LISP共享是块中最后一个值的隐式返回,所有语句也是可以在较大表达式中使用的表达式。
Perl 5添加了支持复杂数据结构,一流函数(即关闭为值)和面向对象的编程模型的功能。其中包括参考,软件包,基于类的方法调度以及词汇范围范围的变量以及编译器指令(例如,strict
PRAGMA )。 Perl 5引入的一个主要附加功能是将代码作为可重复使用的模块包装的能力。沃尔后来说:“ Perl 5的模块系统的整个意图是鼓励Perl培养的增长,而不是Perl Core。”
所有版本的Perl进行自动数据范围和自动内存管理。解释器知道程序中每个数据对象的类型和存储要求;它使用参考计数会根据需要为他们分配并释放存储(因此,如果没有手动干预,它就无法分配循环数据结构)。法律类型的转换(例如,从数字到字符串的转换)是在运行时自动完成的;非法类型的转换是致命错误。
句法
Perl被其批评家称为“线噪声”和仅写作语言。最早的提及是《学习珀尔》的第一版,这是一本由兰德尔·施瓦茨(Randal L.对于经验丰富的Perl程序员,它看起来像是检查的线条噪音,人生的任务。”他还说,可以通过使用“适当的护理”来避免使用Perl是仅写作语言的指控。 Perl概述文档Perlintro指出,内置的“魔术”标量变量的名称“看起来像标点符号或线噪声”。但是,英语模块提供了长长的英语替代方案。 Perlstyle文档指出,可以使用正则表达式中的线噪声来减轻/x
修改器以添加空格。
根据PERL 6常见问题解答,Perl 6旨在减轻引起Perl 5批评家的“线噪声”主张的“常见嫌疑人”,包括删除“大多数标点变量”和Regex Syntax的卫生化。 PERL 6 FAQ还指出,有时称为Perl的线噪声是“语言的实际语法”,就像Gerunds和Gerunds和介词是英语的一部分一样。彩色说,尽管声称“ Rakudo Perl 6失败了,除非受到成人的监督,否则将继续失败。改进的类型系统,具有智能元模型的统一对象系统,元模型以及更清晰的上下文系统,可提供诸如普遍的懒惰之类的细节”。他还说:“ Perl 6具有连贯性和一致性,而Perl 5缺乏。”
在较旧版本的perl中,人们会将Hello World程序写为:
print "Hello, World!\n";
这是一个更复杂的PERL程序,从给定的起始值下降了几秒钟:
#!/usr/bin/perl
use strict;
use warnings;
my ( $remaining, $total );
$remaining = $total = shift(@ARGV);
STDOUT->autoflush(1);
while ( $remaining ) {
printf ( "Remaining %s/%s \r", $remaining--, $total );
sleep 1;
}
print "\n";
Perl解释器也可以用于命令行上的一次性脚本。下面的示例(如sh兼容外壳所调用的bash,例如bash )在当前目录中以.txt结尾的所有文件中的字符串“ bob”转换为“ robert”:
$ perl -i.bak -lp -e 's/Bob/Robert/g' *.txt
执行
通过Perl 5,没有针对Perl版本的Perl语言的书面规范或标准,也没有计划为当前版本的Perl创建一个计划。解释器只有一个实现,该语言随之而来。该口译员及其功能测试是该语言的事实上的规范。但是,Perl 6从规范开始,几个项目旨在实施某些或全部规范。
Perl是用C编写的核心解释器,以及用Perl和C编写的大量模块,截至2010年,解释器的C代码为150,000行,并编译到典型的机器体系结构上可执行的1 MB。另外,解释器可以被编译到链接库并嵌入其他程序中。分布中有将近500个模块,包括200,000行Perl和另外350,000行C代码(模块中的大部分C代码都由字符编码表组成)。
解释器具有面向对象的体系结构。 perl语言的所有元素(scalars,arrays,hashes,coderefs, file anders termes anders )在解释器中由C结构代表。这些结构上的操作由大量的宏, Typedef和功能定义。这些构成Perl C API 。 PERL API可能会引起初学者的困惑,但其切入点遵循一致的命名计划,为使用它的人提供指导。
Perl解释器的寿命大致分为编译阶段和运行阶段。在珀尔(Perl)中,这些阶段是口译员生命周期的主要阶段。每个解释器仅经过每个阶段一次,并且阶段按固定序列遵循。
在Perl的编译阶段中发生的大部分是编译,而在Perl的运行阶段中发生的大部分是执行,但是有很大的例外。 Perl重要地利用其在编译阶段执行Perl代码的能力。 Perl还将延迟汇编为运行阶段。表明在任何时候实际发生的处理类型的术语是编译时间和运行时间。 Perl在编译阶段的大多数点都在编译时间,但是在运行阶段也可以输入编译时间。字符串参数中代码的编译时间传递给eval
内置发生在运行阶段。 Perl通常在编译阶段的运行时间处于运行时间,并且在运行时间中花费大部分运行阶段。代码INBEGIN
块在运行时执行,但在编译阶段执行。
在编译时,解释器将perl代码解析为语法树。在运行时,它通过漫步树来执行程序。文本仅被解析一次,并且语法树在执行之前要进行优化,因此执行相对有效。语法树上的编译时间优化包括恒定折叠和上下文传播,但还执行了窥视孔优化。
Perl具有Turing-Complete语法,因为解析可能会受到编译阶段执行的运行时代码的影响。因此,perl不能通过直的lex / yacc lexer / parser组合来解析。取而代之的是,解释器实现了自己的Lexer,该Lexer与修改后的GNU Bison解析器协调以解决语言的歧义。
通常说“只有Perl可以解析Perl”,这意味着只有Perl解释器(perl
)可以解析perl语言( perl ),但通常这是不正确的。由于Perl解释器可以在编译阶段模拟图灵机,因此需要决定停止问题,以便在每种情况下完成解析。长期以来,停止问题是不可决定的,因此甚至佩尔总是可以解析perl。佩尔(Perl)是使用户在其自身编译阶段访问其完整编程功率的异常选择。从理论纯度方面的成本很高,但实际不便似乎很少。
承诺解析PERL的其他程序,例如源代码分析仪和自动识别者,不仅必须与含糊的句法结构相抗衡,而且还必须在一般情况下perl解析的不确定性。亚当·肯尼迪(Adam Kennedy )的PPI项目专注于解析PERL代码作为文档(保留其作为文档的完整性),而不是将Perl解析为可执行代码(即使Perl本身都无法始终可以做到)。肯尼迪首先猜想“解析佩尔遭受了'停止问题'的困扰”,后来证明了这一点。
PERL分配了超过250,000个功能测试,用于核心PERL语言,核心模块进行了250,000多个功能测试。这些作为正常构建过程的一部分运行,并广泛地行使解释器及其核心模块。 Perl开发人员依靠功能测试来确保解释器的更改不会引入软件错误。此外,看到口译员在其系统上通过其功能测试的Perl用户可以高度信心它正常工作。
端口
Perl均根据Artistic许可1.0和GNU通用公共许可获得双重许可。大多数操作系统可用于分布。它在UNIX和UNIX型系统上尤为普遍,但已移植到大多数现代(和许多过时的)平台上。只有六个报告的例外,Perl可以从所有POSIX compliant上的源代码或与众不同的兼容平台上编译。
由于经典Mac OS环境所需的异常变化,因此独立运输了一个名为Macperl的特殊端口。
全面的Perl存档网络提供了支持平台的完整列表,并链接到每个可用的分布。 CPAN也是不属于核心Perl分布的一部分的公开可用PERL模块的来源。
ActivePerl是来自Activestate的封闭源分布,具有跟踪Core Perl释放的常规版本。先前的分发包括Perl软件包管理器(PPM),这是一种流行的工具,用于安装,删除,升级和管理使用常见Perl模块的使用;但是,此工具从ActivePerl 5.28开始停止。还包括PerlScript , Windows脚本主机(WSH)引擎实现Perl语言。 Visual Perl是一种激活工具,可为Visual Studio .NET开发套件增加Perl。该公司还生产了一个vbscript -to -perl转换器,以及Windows的Perl编译器,以及Awk和Sed到Perl的转换器,并将其包含在Windows的Activestate CD上,其中包括其所有分布以及Komodo IDE和除了Unix/linux/posix在其2002年以及随后的所有第一个。
表现
计算机语言基准游戏比较了几种编程语言中典型编程问题的实现的性能。提交的PERL实现通常在内存 - 使用频谱的高端执行,并给出各种速度结果。 Perl在基准游戏中的性能是典型的解释语言。
大型PERL程序的开始速度要比编译的语言中的类似程序要慢,因为Perl必须每次运行时都必须编译源。在YAPC :: Europe 2005会议和随后的文章“及时开始”的演讲中,让·路易斯·勒罗伊(Jean-Louis Leroy)发现,他的perl计划花费的时间比预期的要长得多,因为佩尔·英国人(Perl Intergeer)花费了大量时间在他的大型中寻找模块包括路径。与Java,Python和Ruby不同,Perl仅具有用于预编译的实验支持。因此,Perl计划对每次执行支付此间接费用。典型程序的运行阶段足够长,以至于摊销的启动时间不是很大的,但是由于此开销,测量非常短的执行时间的基准可能会偏斜。
已经引入了许多工具来改善这种情况。第一个工具是Apache的MOD_PERL ,该工具试图解决迅速调用小Perl程序的最常见原因之一: CGI Web开发。通过Microsoft Isapi , ActivePerl提供了类似的性能改进。
一旦编译了Perl代码,在执行阶段中,对于以C或C ++等编译的语言编写的程序,通常不存在其他开销。此类开销的示例包括字节码解释,参考计数记忆管理和动态类型检查。
最关键的例程可以用其他语言(例如C )编写,可以通过简单的内联模块或更复杂但灵活的XS机制连接到Perl。
申请
Perl具有多种多样的应用程序,并具有许多标准和第三方模块的可用性。
Perl主要用于编写CGI脚本:用Perl编写的大型项目包括CPANEL , SLASH , BUGZILLA , RT , TWIKI和MOVABLE类型;广泛使用的高流量网站包括Priceline.com , Craigslist , IMDB , LiveJournal , DuckDuckgo , Slashdot和Ticketmaster 。它也是流行的Web开发灯技术堆栈的可选组成部分,代替PHP或Python 。 Perl广泛用作Debian Linux分布中的系统编程语言。
Perl通常被用作胶水语言,将不是专门设计用于互操作的系统和接口,以及用于“数据爆炸”(即,用于转换或处理大量数据的任务),例如创建报告。实际上,这些优势密切相关。该组合使Perl成为系统管理员的流行通用语言,尤其是因为可以在单个命令行上输入并运行通常称为“单线程序”的简短程序。
可以使Perl代码在Windows和unix上携带;此类代码通常由软件供应商( COTS和定制)使用,以简化软件构建和部署订阅的包装和维护。
perl/tk和wxperl通常用于将图形用户界面添加到perl脚本。
Perl的文本处理功能可用于生成SQL查询;阵列,哈希和自动内存管理使收集和处理返回的数据变得容易。例如,在Tim Bunce的Perl DBI应用程序编程接口(API)中,对API的参数可以是SQL查询的文本;因此,可以同时使用多种语言编程(例如,在此文档中使用HTML , JavaScript和SQL生成网页)。使用PERL变量插值来编程自定义每个SQL查询,以及Perl数组或哈希的规范作为从每个SQL查询中编程持有的数据集的结构,允许使用大量数据来处理大量数据用于通过Perl子程序进行后处理。在PERL的早期版本中,数据库接口是通过将解释器与客户端数据库库重新链接来创建的。仅对于最重要,最广泛使用的数据库就完成了这很困难,并且限制了结果perl
可执行一次仅使用一个数据库接口。
在Perl 5中,数据库接口由Perl DBI模块实现。 DBI(数据库接口)模块向Perl应用程序提供了一个单个数据库的接口,而DBD(数据库驱动程序)模块将处理访问大约50个不同数据库的详细信息;大多数ANSI SQL数据库都有DBD驱动程序。
DBI为数据库手柄和查询提供了缓存,可以极大地改善长期执行环境(例如MOD_PERL)的性能,从而帮助大量的系统避免了slashdot效果的负载尖峰。
在现代Perl应用程序中,尤其是使用网络框架(例如Catalyst)编写的应用程序中,DBI模块通常通过对象相关映射器(例如dbix :: class ,class,class :: dbi :: dbi :: dbi : : db :: db ::对像生成sql查询)间接使用。并向应用程序作者透明地处理数据。
社区
佩尔的文化和社区与语言本身一起发展。 Usenet是第一个引入Perl的公共场所,但是在其演变过程中,Perl的社区受到扩大基于Internet的服务的增长的影响,包括引入万维网。实际上,佩尔周围的社区是沃尔第一次“洋葱状态”演讲的话题。
洋葱状态是沃尔(Wall)每年关于佩尔(Perl)及其社区进步的年度主题演讲式摘要的名称。它们的特征是他的标志性幽默,提到了佩尔的文化,更广泛的黑客文化,沃尔的语言背景,有时甚至是他的基督教背景。每次演讲首先在各种Perl会议上进行,最终也在网上发布。
在电子邮件,usenet和留言板帖子中,“另一个Perl Hacker ”(Japh)计划是一个普遍的趋势,由最早的专业Perl培训师之一Randal L. Schwartz发起。根据Perl文化的说法,Perl程序员被称为Perl Hackers,从此得出了编写简短程序以打印“只是另一个Perl Hacker”的做法。本着原始概念的精神,这些程序被适度混淆,并且足够短,以适合电子邮件或usenet消息的签名。 Schwartz开发的“规范” Japh最终包括逗号,尽管经常被省略。
Perl“ Golf”是减少Perl程序中使用的角色数量(钥匙“笔触”)的消遣,这与高尔夫球员试图在回合中采取尽可能少的射门的方式相同。该短语的首次用途强调了行人代码之间的差异,旨在教新来者和简短的黑客可能会逗乐经验丰富的Perl程序员,这是后者是Japhs ,它们已经在Usenet Postings和其他地方的签名中使用过。在过去的几十年中,类似的特技在语言APL上是一种未命名的消遣。使用PERL来编写执行RSA加密的程序引起了对这种消遣的广泛和实际兴趣。在随后的几年中,“代码高尔夫”一词已应用于其他语言的消遣。 2000年7月,在加利福尼亚州蒙特雷的Perl会议4.0举行了Perl高尔夫启示录。
与C一样,混淆的代码竞赛是1990年代后期的众所周知的消遣。混淆的佩尔竞赛是1996年至2000年《佩尔杂志》举行的一场比赛,这使佩尔的句法灵活性成为了拱形美德。诸如“最强大”的类别(有效利用空间的程序)和“最佳四行签名”的类别颁发了奖项,该程序适用于usenet签名块风格中的四行76个字符的程序。
Perl Poetry是写作诗歌的做法,这些诗歌可以作为合法的Perl代码,例如被称为Black Perl的作品。 Perl诗歌通过perl语言使用的大量英语单词使得Perl诗歌成为可能。新诗定期提交Perlmonks的社区。