Perl 5.36 发布
2022-06-01 16:49:36 阿炯

Perl 5.36 于2022年5月下旬发布,这是自 Perl 5.34.0 以来大约一年的大版本更新,带来了多项便利的新功能。比如新引入的 use x.xx  功能省略了代码顶部繁琐的功能模块声明,其次稳定了布尔跟踪、正则表达式集、支持 Unicode 14.0 等功能,还新增了内置函数、单次迭代多个值、try/catch 语法支持 finally 关键字等实验性功能。下面介绍一下该版本的主要功能改动:

use v5.36 版本包捆绑功能

Perl 5.36.0 稳定了版本包捆绑(Version bundles)功能,解决了 Perl 被诟病已久的 “样板文件” 问题。该功能只需将这一行放在代码顶部:
use v5.36;
这一行相当于以前的:
require v5.36;
use strict;
use warnings;
use feature 'say';
use feature 'state';
use feature 'current_sub';
use feature 'fc';
use feature 'lexical_subs';
use feature 'signatures';
use feature 'isa';
use feature 'bareword_filehandles';
use feature 'bitwise';
use feature 'evalbytes';
use feature 'postderef_qq';
use feature 'unicode_eval';
use feature 'unicode_strings';
no feature 'indirect';
no feature 'multidimensional';

也就是说,版本包捆绑功能,让开发者使用简单的 use + 版本号;  语句即可达成以下效果:
告诉 perl 解释器和人类读者,当前代码需要 perl 5.36.0 或更高版本才能运行;
支持当前版本 Perl 提供的所有非实验性功能;
使用许多已被广泛实践过的编译指示。

具体到细节,Perl 5.36 版本捆绑的包启用了 signatures 子程序签名功能、 isa 运算符功能(详情参阅 perlop 中的 “类实例运算符”)。禁止了 indirect(间接)和  multidimensional(多维)功能,意味着禁止使用 “间接” 方法调用(如 $x = new Class;)以及禁止使用列表表达式作为哈希键来模拟稀疏多维数组。

-g 命令行标志
新的命令行标志 -g 可用,它是 -0777 的更简单别名。详细信息请参阅 perlrun 中的 “-g”。

支持 Unicode 14.0
关于 Unicode 14.0 的详细信息,请参阅此处

SIGFPE 不再延期
浮点异常现在可以立即传递,表现与其他类似 “故障” 的信号(如 SIGSEGV)相同。

稳定的布尔跟踪
现在即使通过赋值给变量,也能记住 "true" 和 "false" 布尔值的布尔性质,内置的新函数 is_bool () 可以检查一个值是否具有布尔性质。

转为稳定的实验性功能
实验性的正则表达式集功能(正式名称为 “扩展括号字符类”)已转为稳定功能,详情参阅 perlrecharclass 中的 “扩展括号字符类”。
可变长度的 Lookbehind 变为稳定功能,但包含捕获括号的 Lookbehind 仍保持实验性。

新的实验性功能

单次迭代多个值(实验性)
现在可以通过在括号内指定词汇列表来一次迭代多个值。例如:
for my ($key, $value) (%hash) { ... }
for my ($left, $right, $gripping) (@moties) { ... }

更多详细信息,请参阅 perlsyn 中的 “复合语句”。

builtin 内置函数(实验性)
添加了一个新的 builtin  核心模块,它可为内置在解释器中的、新的始终存在的函数(always-present functions)提供文档。

say "Reference type of arrays is ", builtin::reftype([]);

它还提供了一种词法导入机制,用于提供这些函数的短名称版本。

use builtin 'reftype';
say "Reference type of arrays is ", reftype([]);

有关该函数的详细信息,请参阅 builtin 。

defer 延迟块(实验性)
此版本增加了对 defer 块的支持,这些块是以 defer 修饰符为前缀的代码块。即提供了一段代码,稍后在范围退出期间运行。在运行时到达一个 defer 块时,它的主体将被搁置,以在退出封闭范围时运行。defer 块可用于代替 “范围保护” 对象,向对象传递要由其析构函数运行的代码块。详细信息请参阅 perlsyn 中的 “延迟块”。

try/catch 支持 finally 关键词(实验性)
实验性 try/catch 语法已扩展为支持 finally 关键字:
try{
attempt();
print "Success\n";
}
catch ($e){
print "Failure\n";
}
finally{
print "This happens regardless\n";
}

详细信息参阅 perlsyn 中的 “try/catch 异常处理”。

非 ASCII 分隔符(实验性)
此前 Perl 只允许四对字符串 / 模式分隔符:() {} [ ] 和 < >,都在 ASCII 范围内。而 Unicode 有数百种符号,使用非 ASCII 分隔符功能可以实现其中的许多可能性。 比如  qr« » ,或者 q????字符串????。

详细信息请参阅 “'extra_paired_delimiters' 功能”。

以上是部分功能更改,该版本还包含一些功能弃用、性能增强和模块更新内容,感兴趣的朋友可在 Perl 5.36 版本更新说明中查阅。


Perl可以说是全球最常用的语言之一,在它全盛的时代,人们会经常用它开发网络程序,但时至今日,开发者对于Perl的评价却是两极分化的:有人会郑重地纪念它的生日,有人却希望它快点“过去”。版本更新能否挽救日渐没落的Perl,不再流行的Perl会逐渐消失吗?

1、三十余年坎坷路

Perl 7还在远方

编程语言Perl是“Practical Extracting and Reporting Language”的缩写,意为实用提取和报告语言。Perl的功能丰富,可以在超过100种计算机平台上运行。Perl最初是为文本处理而开发的,现在则多用于各种任务,包括网络编程、Web开发、系统管理、GUI开发等。

1987年12月18日,Perl 1.0正式发布,其最初的设计者是拉里·沃尔(Larry Wall)。Perl语言借鉴了C、Sed、awk、shell脚本语言以及很多其他程序语言的特性,其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。

Perl 2.0在1988年6月发布,Perl 3.0和Perl 4.0则分别在1989和1991年发布。1994年发布的Perl 5是最重要的一个版本,这个版本也成为使用最为广泛的版本。

2015年12月25日,开发了十多年的Perl 6在圣诞节正式发布。Larry Wall以Perl 6吉祥物Camelia的名义宣布Perl 6可以在产品中使用,但强调其仍然处于青春期,意味着它有几分成熟了,但依然存在一些问题。

进入到第四个十年的Perl,在这些年经历了太多的起起落落。根据Perl指导委员会的说法,尽管5.36于2022年6月发行,但万众期待的Perl 7继续在远处闪烁,Perl 6在扬帆起航。

2、不止一种方法可以做到

Perl是一种自然和智能语言,它能根据上下文环境解释执行,同时有大量省略写法。Perl语言的座右铭是:There’s More Than One Way To Do It (TMTOWTDI,有多种方法可以完成一件事,或者“条条道路通罗马”)。

如果你想使用sed、awk或sh来解决问题,但是却发现它们的能力不够,或者想运行得更快一点,却不想傻傻地用C来写,Perl将是很好的选择。Perl擅长于文本处理和系统管理,不适合于实时嵌入式系统编程、操作系统底层开发(比如驱动程序开发)、复杂的多线性共享内存应用以及较大的应用。

Perl拥有动态语言强大灵活的特性,并且从C/C++、Basic、Pascal等语言中分别借鉴了语法规则,从而可以提供很多冗余语法。或许正因如此,它被评价为“write-only”——虽然你可以写得很随意,但是可能会得到意料之外的结果而不报错。除此之外,让程序员感到头疼的还有它冗长的程序代码,实现相同功能的程序代码长度可能相差十倍百倍。

事实上,人们现在更习惯使用Perl来写服务器脚本。与多数的网页编程语言(PHP或Java)相比,Perl是可以直接执行的。为了使源代码能够被直接翻译成机器语言,它在执行每一行代码之前都先翻译,因此省去了编译的时间。

Perl最强的一点在于,它可以执行用其他计算机语言所编写的代码或子程序。此外,它还能够利用处理器,让开发者可以在海量的库和模块中任意挑选;并且适用于各类数据库管理,支持SQL语句查询,通过DBI模块对返回结果进行处理。

另一个为人称赞的是,Perl只有三种数据类型,标量(scalar)、数组和哈希。其中,标量是最简单的数据类型,一般是指单个数字、整数、文本或者引用。一连串的标量可以有不同的处理方式,通常被称为数组。以特定形式将值键组合的数据形式被称为哈希。在Perl中,值键用标量表示,而类型则以文本字符串的形式表示。

下面罗列了一些关于Perl语言的 优势与不足:

Perl语言的优势:
正则表达式:Perl最擅长的一件事,就是文本操作。许多语言都有正则表达式,但Perl几乎是他们的发明人。并且它是内置的,不需要任何模块。
灵活性:Perl具有三种基本的变量类型:标量、数组和哈希。你可以随意使用所有引用,而不必担心内存泄漏或整个PC崩溃的情况。
Unicode支持(相对AWK与C)
可移植性:Perl在网络上运行良好。它在UNIX中效果很好。它甚至在Windows中也能很好地工作。它不是单一功能,而是“万事通”。
CPAN:你可以找到所有你需要的东西。此外,通过CPAN安装任何模块都非常容易。直接从CPAN安装,在解决依赖关系方面,它与apt-get一样出色。

其不足之处在于:
动态类型语言,不是很可靠;
自然语言,是优点也是缺陷,使得Perl语言代码可能晦涩难懂;
智能语言,是优点也产生不足:根据上下文解释编程者之意,可能产生臆断,也因此产生很多编程陷阱;
不是很优美,多种方法做事,有时会让编程者无所适从。
性能问题,Perl灵活的数据结构和处理性能通常不是很高(相对C/C++),若需要高性能的处理,有时需要使用其它语言重写。

Perl语言的学习曲线浅而长。只要看看《Learning Perl》,就可以编写简单的Perl程序了,然而要深入掌握Perl,要使用Perl的复杂数据结构,进行面向对象编程、多线程编程则不是那么容易的事,需要很长的时间去学习和实践。

3、Perl会消失吗?

十多年前,就有人问过类似这种问题,但是事到如今,Perl依然活得很好,并没有消失。Perl在文本处理、数据挖掘、运维、生物信息等众多领域均有不错的应用,只是它不像互联网热点被人们所关注罢了。

客观来说,Perl本身是一门古老的语言,但它拥有一个生机勃勃且生产效率很高的社区,其价值体现在CPAN库中。正如程序员Rox所说,几乎没有任何一种语言具有像CPAN一样广泛和全面的库,一切都近在咫尺。在CPAN中,你可以找到成千上万的模块和框架,并通过它们来完成你想象的任何事情。

需要网络服务器吗?有HTTP :: Server;需要一个独立的数据库吗?有Muldis::DB。无论你的需求是什么,通常都可以找到几个满足您需求的模块,你只需要选择最适合你的应用程序的模块即可。

Rox表示,至于Ruby,Python和其他竞争对手,健康的竞争对Perl来说是巨大的好事。其他语言得到的任何东西,Perl社区都用Perl重写。例如,当Ruby在Rails的成功上飞速发展时,Perl有了Dancer,在许多方面都比Rails更好。

Perl不会死,也不会消失。周围没有什么浮华的事情,没有公司可以从炒作Perl中受益,因此它并没有引起媒体的广泛关注,也不是每个人都知道Perl,所以对此的讨论也较少。

另需说明的是,尽管Perl可能并不适用于应用类的开发,或者做CGI的Web开发,但是作为脚本语言在数据挖掘、Linux系统管理等偏重于面向过程的文本处理分析方面,仍然是非常顺手的工具,并且有很多自动化测试领域的工具都是Perl写的,所以Perl还是会活得好好的,只是逐渐淡出了为人们所熟知的Perl CGI开发而已。

4、写在最后

客观来说,Perl仍然存在较大的价值和潜力,但也不得不承认它现在陷入了困境。未来,如果在不影响向后兼容性的情况下对其进行现代化改造,保持向后兼容性,促使它更易于使用现代功能,或许就能激发这门语言的更大潜力。正如程序员Nikos Vaggalis所说,无论什么情况下,Perl的长寿和繁荣都是有保证的。