Perl 6 程式設計教學:運算子

Perl 6 的運算子較多,本文僅列出常見的運算子。

運算子的種類

根據運算子的位置,分為以下五種:

  • Prefix,例:-3
  • Infix,例:3 + 2
  • Postfix,例:$a++
  • Circumfix,例:<foo bar baz> (字串串列)
  • Postcircumfix,例:@arr[0] (陣列取索引)

平常不需死記這些分類,但這個概念對於實作運算子重載 (operator overloading) 會有幫助,我們將於後文說明。

代數運算子

  • +:相加
  • -:相減
  • *:相乘
  • /:相除
  • div:整數相除
  • %:取餘數,可用於有理數
  • mod:整數取餘數
  • **:指數
  • gcd:取最大公約數
  • lcm:最最小公倍數

以下為實例:

遞增遞減運算子

  • ++:遞增 1
  • --:遞減 1

遞增/減放在變數前後的效果略有不同,但刻意操作這種效果不是好習慣,建議將這類運算子分開獨立的一行撰寫。

二元運算子

  • +&:bitwise AND
  • +|:bitwise OR
  • +^:bitwise XOR
  • +<:左移
  • +>:右移

以下是實例:

比較運算子

要注意的是,Perl 6 有兩套比較運算子,分別用於數字和字串。

  • 比較數字
    • ==:相等
    • !=:不相等
    • >:大於
    • >=:大於等於
    • <:小於
    • <=:小於等於
  • 比較字串
    • eq:相等
    • ne:不相等
    • gt:大於
    • ge:大於等於
    • lt:小於
    • le:小於等於

以下是實例:

除了以上比較運算子,還有以下幾種相等運算子:

  • ~~:智能相等運算子,會根據兩邊的值自動比對是否相等
  • eqv:相等運算子,檢查兩邊的值型別相等且值相等
  • ===:物件相等運算子,對基本型別,同於 eqv,對物件來說,要相同物件才會相等
  • =~=:浮點數相等運算子,當浮點數誤差夠小時相等,預設誤差值為 10 的 -15 次方

另外還有數種三元運算子:

  • cmp:智能三元運算子,會根據兩邊的值自動比對
  • <=>:數字三元運算子,會將兩邊的值轉為 Real 型別
  • leg:字串三元運算子,會將兩邊的值轉為字串後比較 (註:leg 是 less、equal、greater 的縮寫)

另外還提供比較順序的運算子,可用於多種型別:

  • before
  • after

邏輯運算子

要注意的是,Perl 6 有兩套邏輯運算子,兩者優先度有所不同。

  • 低優先度
    • and:且
    • or:或
    • not:否定
  • 高優先度
    • &&:且
    • ||:或
    • !:否定

以下是實例:

布林轉換運算子

布林轉換運算子會將值轉為布林值,可用於條件判斷中。

  • 前綴的 ?:較高優先度
  • 前綴的 so:較低優先度

使用本運算子的要點在於知道那些值為 falsey,即會判定為 False 的值,例子如下:

  • 未定義的變數
  • Nil
  • 0 (整數零)
  • 0.0 (有理數零)
  • "" (空字串)
  • () (空串列)
  • {} (空雜湊)

其他的值則為 truthy,即會判定為 True 的值。

字串運算子

  • x:字串重覆
  • 二元 ~:字串相接
  • 前綴 ~:將值轉為字串

以下是實例:

範圍運算子

  • ..:含頭尾
  • ..^:含頭不含尾
  • ^..:不含頭含尾
  • ^..^:不含頭不含尾

見以下實例:

運算子優先順序

Perl 6 的運算子優先順序很複雜,但不需強記,因為

  • 數學相關的運算子其優先順序和數學中相同
  • 用括號可改變優先順序

運算子重載

Perl 6 支援運算子重載 (operator overloading),除了內建型別外,我們也可以為自訂型別自訂相關的運算子操作,這些自訂型別就可以如同內建型別般操作,例如:向量 (vector) 或矩陣 (matrix) 型別。我們將於物件導向程式中介紹運算子重載。