来源:OSCHINA 时间:2023-07-04 11:18:35
Perl 5.38 已正式发布,以下为此版本部分新特性:
class
功能现在可以使用新的实验性语法来定义对象类,其中每个实例的数据存储在行为类似于词汇的“字段”变量中。
(资料图片仅供参考)
use feature "class"; class Point{ field $x; field $y; method zero { $x = $y = 0; }}
这是一个新的实验性功能,并且仍在开发中。
有关 Unicode 15.0 的详细信息,请参阅 https://www.unicode.org/versions/Unicode15.0.0/。
所有弃用警告现在都有自己特定的弃用类别,可以单独禁用。可以在 perldeprecation 和警告中查看所有已弃用功能的列表。
+- deprecated ----+| || +- deprecated::apostrophe_as_package_separator| || +- deprecated::delimiter_will_be_paired| || +- deprecated::dot_in_inc| || +- deprecated::goto_construct| || +- deprecated::smartmatch| || +- deprecated::unicode_property_name| || +- deprecated::version_downgrade
仍然可以在单个语句中禁用所有弃用警告
no warnings "deprecated";
但现在可以进行更细粒度的控制,这些警告会自动启用
use warnings;
引入了一个名为%{^HOOK}
的新哈希,当关键字支持任何类型的特殊 hook 时,该 hook 将存在于这个新的哈希中。此哈希中的 hook 将以调用它们的函数命名,后跟两个下划线,然后是它们执行的阶段,当前是在执行关键字之前或之后。
此初始版本支持两个hooks:require__before
和require__after
,可更轻松地在 require 语句之前和之后执行任务。
有关详细信息,请参阅 perlvar。
添加了一个新的环境变量PERL_RAND_SEED
,可用于导致 Perl 程序使用rand
而不显式使用srand()
或使用srand()
没有可重复的参数。详情参见 perlrun。
可以在编译时通过传递禁用此功能
-Accflags=-DNO_PERL_RAND_SEED
在构建过程中进行配置。
现在可以使用//=
或||=
运算符分配子例程签名参数的默认表达式,以便在调用者(分别)提供未定义或 false 值时应用默认值,而不仅限于当参数完全丢失时。
有关更多详细信息,请参阅 perlsub 中的文档。
@INC
hook的内部结构已得到强化,可以处理各种边缘情况,且当 hook 在 require 操作期间修改@INC
时,不再出现段错误或抛出断言失败。现在确保任何给定的钩子在 require 调用期间最多执行一次,并且任何重复的目录不会触发额外的目录探测。
为了更好地控制动态模块查找,现在支持新的 hook 方法INCDIR
。支持该方法的对象可以被注入到@INC
数组中,当模块搜索过程中遇到它时就会执行它,就像 INC hook 的执行方式一样,其返回值作为列表使用用于搜索模块的目录。返回空列表相当于无操作。
@INC
中不支持INC
或INCDIR
方法的 Blessed CODE 引用将不再触发异常,而是被视为与 Unblessed coderef 相同,并像INC
hook 一样执行。
许多正则表达式量词过去仅限于U16_MAX
,但现在仅限于I32_MAX
,因此现在可以编写/(?:word){1000000}/
。请注意,这样做可能会导致正则表达式引擎运行时间更长并使用更多内存。
defer
和finally
块中允许某些goto
Perl 版本 5.36.0 添加了defer
块,并允许finally
关键字添加与try
/catch
语法类似的行为。但不允许主体内有任何goto
表达式,因为它可能导致控制流跳出块。
现在,部分goto
表达式已被允许添加,如果它们具有恒定的目标标签,并且该标签可在块中找到。
use feature "defer"; defer { goto LABEL; print "This does not execute\n"; LABEL: print "This does\n";}
以上为部分重点更新功能,完整的功能变更和弃用/修复,可在官方公告中查看。