跳轉到內容

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


前一節:函式 索引 下一節:開始練習
華夏公益教科書