Perl 编程/Perl 5.10 新增功能
Perl 5.10 是 perl 编程语言的一个发布版本,其中包含一些新的特殊功能。大约在 Perl 5.10 准备发布的时候,新 Perl 6 语言的设计正在快速推进。Perl 6 将与 Perl 5 大不相同,但在某些方面仍然非常相似。
由于这两个版本是同时设计的,而且一些相同的人员参与了这两个设计过程,所以这两个版本共享了一些特性。从交换中,Perl 5.10 获得了 **智能匹配运算符**、一个 switch 风格的 **given-when** 控制结构、一个 **定义或** 运算符和 **状态变量**,以及一些内部性能增强。
**智能匹配** 运算符类似于==以及eq以及=~它们都挤在一起,还添加了一些额外的功能。智能匹配确定两个对象是否匹配,无论你向它抛出什么类型的对象。
Perl 最终在语言中内置了一个 **switch** 类似的语句。与 C 中常见的 **switch** 和 **case** 关键字不同,Perl 5.10 使用 **given** 和 **when**。
例如
my $option = 3;
given ($option) {
when (0) { say 'Option 0 is chosen!'; }
when (1) { say 'We have an option 1 here'; }
when (2) { say 'Option is 2'; }
}
但是,Perl 的 **given** / **when** 结构比 C 的 **switch** / **case** 结构要强大得多。它不仅允许每个 **when** 子句使用整数作为匹配条件,还允许使用字符串、正则表达式,甚至数组。例如
my $name = 'Superman';
given ($name) {
when ('Batman') { say 'Da na na na na na na na ... BATMAN!'; }
when ('Superman') { say "It's a bird, it's a plane..."; }
when (/woman/) { say 'Good day miss'; }
}
考虑经常使用的代码片段
if (!defined($thing)) {
$thing = $new_thing;
}
或者,更符合 Perl 风格的版本
$thing = $new_thing unless(defined($thing));
由于这非常常见,因此决定将其变成自己的运算符:**定义或** 运算符
$thing //= $new_thing;
Perl 5.10 引入了 **state** 关键字来声明持久变量,这些变量在调用子例程之间保留其值。状态变量与 C 中的静态变量的功能大致相同。
在以前的 Perl 版本中,要声明持久变量,我们必须在子例程之外声明它
{
my $count = 0;
sub incrementCount {
return $count ++;
}
}
这种结构相当丑陋,因为子例程本身必须放在一个块中。使用新的 **state** 关键字,我们可以将上面的代码重写为
sub incrementCount {
state $count = 0;
return $count ++;
}
- Perl 5.10 发布公告:https://dev.perl5.cn/perl5/news/2007/perl-5.10.0.html