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 提供的所有非实验性功能;
- 使用许多已被广泛实践过的编译指示。
signatures
子程序签名功能、 isa 运算符功能(详情参阅 perlop 中的“类实例运算符”)。禁止了 indirect(间接)和 multidimensional(多维)功能,意味着禁止使用“间接”方法调用(如 $x = new Class;)以及禁止使用列表表达式作为哈希键来模拟稀疏多维数组。
-g 命令行标志
新的命令行标志 -g 可用,它是 -0777 的更简单别名。详细信息请参阅 perlrun 中的“-g”。
支持 Unicode 14.0
关于 Unicode 14.0 的详细信息,参阅 https://www.unicode.org/versions/Unicode14.0.0/。
SIGFPE 不再延期
浮点异常现在可以立即传递,表现与其他类似“故障”的信号(如 SIGSEGV)相同。
稳定的布尔跟踪
现在即使通过赋值给变量,也能记住 "true" 和 "false" 布尔值的布尔性质, 内置的新函数 is_bool() 可以检查一个值是否具有布尔性质。
转为稳定的实验性功能
- 实验性的正则表达式集功能(正式名称为“扩展括号字符类”)已转为稳定功能,详情参阅 perlrecharclass 中的“扩展括号字符类”。
- 可变长度的 Lookbehind 变为稳定功能,但包含捕获括号的 Lookbehind 仍保持实验性。
新的实验性功能
- 单次迭代多个值(实验性)
现在可以通过在括号内指定词汇列表来一次迭代多个值。例如,
for my ($key, $value) (%hash) { ... }
for my ($left, $right, $gripping) (@moties) { ... }
更多详细信息,请参阅 perlsyn 中的“复合语句”。
- builtin 内置函数(实验性)
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 {
attempt();
print "Successn";
}
catch ($e) {
print "Failuren";
}
finally {
print "This happens regardlessn";
}
详细信息参阅 perlsyn 中的“try/catch 异常处理”。
- 非 ASCII 分隔符(实验性)