perl 正则表达式 引擎_Perl 5引擎概述

 2023-09-18 阅读 23 评论 0

摘要:perl 正则表达式 引擎 正如我在“ 我的DeLorean运行Perl ”中所述,切换到Perl极大地提高了我的开发速度和可能性。 在这里,我将更深入地研究Perl 5的设计,以讨论对系统编程很重要的方面。 stdin (是,为文本),并在stdout上发

perl 正则表达式 引擎

正如我在“ 我的DeLorean运行Perl ”中所述,切换到Perl极大地提高了我的开发速度和可能性。 在这里,我将更深入地研究Perl 5的设计,以讨论对系统编程很重要的方面。

stdin (是,为文本),并在stdout上发出用户输入。 然后,我有了一个bash include文件,该文件将所有OpenGL函数声明为Bash函数,该函数将函数的名称回显到管道中,如果尚未运行GL解释器进程,则将其启动。 练习的目的是表明OpenGL(1.4 API,而不是较新的着色器)可以通过使用GL显示列表以每帧仅几次调用的方式渲染大量图形。 OpenGL库完成了所有繁重的工作,而Bash每帧只打印了几十行文本。

最终,Bash是一种非常可怕的胶合语言 ,无论是高开销还是有限的可用操作和语法。 另一方面, Perl是一种很棒的粘合语言。

除了语法...

perl正则表达式匹配特定, 如果您不是Perl的普通用户,那么您可能会注意到的第一件事就是语法。

Perl 5建立在长期笨拙语法的基础上,但是最近的版本已经消除了许多标点符号的需求。 可以通过选择为您提供特定于域的“语法糖”的模块来避免剩余的疣,这些模块甚至会在解析Perl语法时对其进行更改。 这与大多数其他语言形成了鲜明的对比,在大多数其他语言中,您只能使用所给出的语法,并且比C的宏更加灵活。 与Perl强大的稀疏语法运算符(例如mapgrepsort和类似的用户定义运算符)相结合,与使用JavaScript,PHP或任何编译语言相比,与Perl相比,与Perl相比,我几乎总是可以更清晰,更轻松地编写复杂的算法。

因此,因为语法就是您使用的语法,所以我认为底层机器是该语言最重要的方面。 Perl 5具有非常强大的引擎,它在有趣和有用的方式上与其他语言有所不同。

C上方的一层

我不建议任何人通过查看解释器的内部API来开始使用Perl,但是快速描述是有用的。 在C语言世界中,我们要解决的主要问题之一是获取和释放内存,同时还通过一系列函数调用来支持控制流。 C具有使用longjmp引发异常的粗略能力,但它不会为您做任何清理,因此,如果没有框架来管理资源,它几乎是无用的。 Perl解释器正是这种框架。

java正则表达式详解, Perl提供了独立于C函数调用堆栈的变量堆栈,您可以在其上标记Perl范围的逻辑边界。 还有一些API调用,可用于分配内存,Perl变量等,并告诉Perl在Perl范围的末尾自动释放它们。 现在,您可以使自己喜欢的C调用变成“死”,让Perl为您清理一切。

尽管这确实是一个非常规的观点,但我要强调的是Perl位于C之上,并允许您使用任意多的解释开销。 Perl的内部API在一般编程方面肯定不如C ++好,但是在完成工作后,C ++并不能在您的工作之上提供一种解释语言。 我忘记了想要反射功能来检查或更改C ++对象的次数,并且随之而来的是兔子洞使我的多个个人项目脱轨。

类Lisp函数

Perl函数采用参数列表。 缺点是您必须在运行时进行参数计数和类型检查。 好处是您不会做那么多,因为您可以让解释器自己的运行时检查捕获这些错误。 您还可以通过检查给定的参数并相应地表现,来创建C ++重载函数的效果。

因为参数是一个列表,而返回值是一个列表,所以这鼓励使用Lisp风格的编程 ,在此您可以使用一系列函数来过滤数据元素列表。 这种“管道”或“流”效应可能导致某些真正复杂的循环变成一行代码。

powershell 正则表达式。 语言可以将每个函数用作coderef ,可以在变量中传递,包括匿名闭包函数。 此外,我发现sub {}键入比JavaScript的function(){}或C ++ 11的[&](){}

通用数据结构

Perl中的变量要么是“标量”,引用,数组或“哈希”,要么是其他一些我将跳过的东西。

标量起着字符串/整数/浮点混合的作用,并会根据您使用它们的目的自动进行类型转换。 换句话说,不是通过变量的类型确定操作,而是由运算符的类型确定如何解释变量。 这比语言预先知道类型的效率低,但效率却不如Shell脚本,因为Perl会缓存类型转换。

Perl标量可能包含空字符,因此它们完全可用作二进制数据的缓冲区。 标量是可变的,可以按值复制,但是使用写时复制进行了优化,子字符串操作也得到了优化。 字符串支持unicode字符,但可以有效地作为普通字节存储,直到您在255以上附加代码点为止。

正则表达式怎么用, 引用(也被视为标量)包含对任何其他变量的引用; hashrefsarrayrefs以及上述coderefs最为常见。

数组只是标量(或引用)的动态长度数组。

哈希(即字典,地图或任何您想调用的名称)是一种性能优化的哈希表实现,其中每个键都是一个字符串,每个值都是一个标量(或引用)。 在Perl中使用散列的方式与在C语言中使用结构的方式相同。显然,散列的效率不如结构,但它使事物保持通用,因此需要数十种其他语言代码行的任务可以成为Perl中的单行代码。 例如,您可以将散列的内容转储到(键,值)对的列表中,或从这样的列表中重建散列,这是Perl语法的自然组成部分。

对象模型

任何引用都可以被“祝福”以使其成为一个对象,从而为它赋予一个多重继承方法-分配表。 祝福只是一个包(名称空间)的名称,并且该名称空间中的任何函数都成为对象的可用方法。 继承树由包中的变量定义。 因此,您可以通过简单的数据编辑而不是特殊的关键字或内置的反射API来对类或类层次结构进行修改,或即时创建新的类。 通过将其与Perl的local关键字(在当前作用域的末尾自动撤消对全局变量的更改)结合使用,您甚至可以对类方法或继承进行临时更改!

正则表达式入门、 Perl对象仅具有方法,因此可以通过访问器(如规范的Java get_set_方法)访问属性。 Perl的作者通常将它们组合成仅具有属性名称的单个方法,并根据是否给定参数来区分setget

您还可以将对象从一个类“重新祝福”到另一个类,这可以实现大多数其他语言中没有的有趣技巧。 考虑一下状态机,状态机通常会通过检查对象的当前状态来开始; 您可以通过将方法表交换为与对象状态匹配的方法表来避免这种情况。

能见度

虽然其他语言在类之间的访问规则上花费了大量精力,但Perl采取了一个简单的“如果名称以下划线开头,除非您使用,否则不要碰它”的约定。 尽管我可以看到一支不受纪律的软件团队可能会遇到的问题,但根据我的经验,它的工作效果很好。 C ++的private关键字对我所做的唯一一件事就是削弱了我的调试工作,但是将所有内容public都感到很肮脏。 Perl消除了我的罪恶感。

同样,一个对象提供方法,但是您可以忽略它们,而只访问底层的Perl数据结构。 这是调试的另一个巨大推动力。

通过引用计数进行垃圾收集

perl中正则表达式匹配空格, 尽管引用计数是内存管理的一种很容易泄漏的形式(它不检测周期),但它有一些好处。 就像在C ++中一样,它使您可以确定性地破坏对象,而不会因意外的垃圾回收而中断程序。 它强烈鼓励模块作者使用对象树模式,与Java和JavaScript中常见的对象缠结模式相比,我更喜欢这种模式。 (我发现使用单元测试可以更容易地测试树。)但是,如果您需要一堆对象,Perl确实提供了“弱”引用,在决定是否应该进行垃圾收集时不会考虑该引用。的东西。

总体而言,这是我唯一一次难过的事情,是在事件驱动的回调中大量使用闭包时。 让对象持有对事件句柄的引用很容易,而事件句柄持有对引用包含对象的回调的引用。 同样,弱引用解决了这个问题,但是要意识到JavaScript或Python不会使您担心,这是一件额外的事情。

平行性

Perl解释器是一个单线程,尽管用C编写的模块可以在内部使用其自己的线程,并且Perl通常在同一进程中包括对多个解释器的支持。

尽管这是一个很大的限制,但是知道一个数据结构只会被一个线程触摸是一件很不错的事,这意味着从C代码访问锁时不需要锁。 即使在Java中,以便捷的方式将锁定内置在语法中,也可以实时地通过线程可以交互的所有方式进行推理(尤其令人讨厌的是,它们迫使您在编写的每个GUI程序中都要进行处理) )。

正则表达式详解? 有几个事件库可用于协助编写Node.js样式的事件驱动的回调程序,从而避免了对线程的需求。

访问C库

除了通过Perl的XS系统直接编写自己的C扩展之外,已经有很多通用的C库为您打包,并且可以在Perl的CPAN存储库中使用。 还有一个很棒的模块Inline :: C ,它消除了在Perl和C之间架桥的大部分麻烦,您只需将C代码粘贴到Perl模块的中间即可。 (它会在您首次运行时进行编译,并缓存.so共享对象文件以供后续运行。)如果您想操纵Perl堆栈或打包/解包Perl之外的变量,则仍然需要学习一些Perl解释器API。 C函数参数和返回值。

内存使用情况

Perl可以使用数量惊人的内存,尤其是如果您使用重量级的库并创建了数千个对象,但是对于今天的系统而言,这通常并不重要。 它也没有比其他解释系统差很多。 我个人的喜好是仅使用轻量级库,这通常也会提高性能。

启动速度

在现代硬件上,Perl解释器的启动时间不到5毫秒。 如果您只使用轻量级模块,则可以将Perl用于可能已用于Bash的所有内容,例如hotplug脚本。

正则表达式的实现

正则表达式或者怎么表示? Perl提供了所有正则表达式实现的基础……但是您可能已经知道了。 正则表达式内置于Perl的语法中,而不是面向对象或基于函数的API。 这有助于鼓励它们用于您可能需要做的任何文本处理。

无处不在和稳定

Perl 5几乎安装在每个现代Unix系统上,并且CPAN模块集合非常广泛且易于安装。 几乎所有任务都有一个生产质量模块,具有可靠的测试覆盖范围和良好的文档记录。

在过去的20年中,Perl 5具有几乎完全的向后兼容性。 社区也接受了这一点,因此大多数CPAN都很稳定。 甚至有一组测试人员会定期在所有CPAN上运行单元测试,以帮助发现损坏。

工具链也很牢固。 文档语法(POD)比我想要的更为冗长,但是它产生的结果比doxygen或Javadoc更有用。 您可以运行perldoc FILENAME来立即查看您正在编写的模块的文档。 perldoc Module::Name您显示了要从include路径加载的模块版本的特定文档,并且同样可以向您显示该模块的源代码,而无需深入浏览文件系统。

测试用例系统( prove命令和Test Anything Protocol,或TAP)不是Perl特有的,并且使用起来非常简单(与基于特定于语言的面向对象的结构或XML的单元测试相反)。 诸如Test::More类的模块使编写测试用例变得如此容易,以至于您可以在大约一次手动测试模块的同一时间编写一个测试套件。 测试工作的障碍是如此之低,以至于我也开始为非Perl项目使用TAP和POD文档样式。

综上所述

尽管有大量的更新语言与之竞争,但Perl 5仍然提供了很多功能。 前端语法还没有停止发展,您可以根据需要使用自定义模块进行改进。 Perl 5引擎能够处理您可能会遇到的大多数编程问题,它甚至适合作为C库顶部的“胶水”层进行低级工作。 一旦真正熟悉它,它甚至可以成为开发C代码的环境。

翻译自: https://opensource.com/article/18/1/why-i-love-perl-5

perl 正则表达式 引擎

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/73284.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息