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 釋出公告:http://dev.perl.org/perl5/news/2007/perl-5.10.0.html