跳转到内容

Perl 编程/Perl 5.10 新增功能

来自维基教科书,开放的书籍,面向开放的世界
前一节:函数 索引 下一节:开始练习

Perl 5.10

[编辑 | 编辑源代码]

Perl 5.10 是 perl 编程语言的一个发布版本,其中包含一些新的特殊功能。大约在 Perl 5.10 准备发布的时候,新 Perl 6 语言的设计正在快速推进。Perl 6 将与 Perl 5 大不相同,但在某些方面仍然非常相似。

由于这两个版本是同时设计的,而且一些相同的人员参与了这两个设计过程,所以这两个版本共享了一些特性。从交换中,Perl 5.10 获得了 **智能匹配运算符**、一个 switch 风格的 **given-when** 控制结构、一个 **定义或** 运算符和 **状态变量**,以及一些内部性能增强。

智能匹配运算符

[编辑 | 编辑源代码]

**智能匹配** 运算符类似于==以及eq以及=~它们都挤在一起,还添加了一些额外的功能。智能匹配确定两个对象是否匹配,无论你向它抛出什么类型的对象。

Given - when

[编辑 | 编辑源代码]

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 ++;
}


前一节:函数 索引 下一节:开始练习
华夏公益教科书