Perl 6 中的操作符(一)

操作符優(yōu)先級(jí)

S03-operators/arith.t lines 46–342

S03-operators/precedence.t lines 5–200

Perl 6 擁有和 Perl 5 同等數(shù)量的優(yōu)先級(jí)級(jí)別铺浇,但是它們散布在不同的地方。這兒孤紧,我們列出了從最緊湊到最松散的級(jí)別于购,每一級(jí)別還有幾個(gè)例子:

最高優(yōu)先級(jí)到最低優(yōu)先級(jí):


A  Level             Examples
=  =====             ========
N  Terms             42 3.14 "eek" qq["foo"] $x :!verbose @$array
L  Method postfix    .meth .+ .? .* .() .[] .{} .<> .?? .:: .= .^ .:
N  Autoincrement     ++ --
R  Exponentiation    **
L  Symbolic unary    ! + - ~ ? | || +^ ~^ ?^ ^
L  Multiplicative    * / % %% +& +< +> ~& ~< ~> ?& div mod gcd lcm
L  Additive          + - +| +^ ~| ~^ ?| ?^
L  Replication       x xx
X  Concatenation     ~
X  Junctive and      & (&) ∩
X  Junctive or       | ^ (|) (^) ∪ (-)
L  Named unary       temp let
N  Structural infix  but does <=> leg cmp .. ..^ ^.. ^..^
C  Chaining infix    != == < <= > >= eq ne lt le gt ge ~~ === eqv !eqv (<) (elem)
X  Tight and         &&
X  Tight or          || ^^ // min max
R  Conditional       ?? !! ff fff
R  Item assignment   = => += -= **= xx= .=
L  Loose unary       so not
X  Comma operator    , :
X  List infix        Z minmax X X~ X* Xeqv ...
R  List prefix       print push say die map substr ... [+] [*] any Z=
X  Loose and         and andthen
X  Loose or          or xor orelse
X  Sequencer         <== ==> <<== ==>>
N  Terminator        ; {...} unless extra ) ] }

下面使用的兩個(gè) ! 符號(hào)通常表示任意一對(duì)兒擁有相同優(yōu)先級(jí)的操作符室谚, 上表指定的二元操作符的結(jié)合性解釋如下(其中 A 代表結(jié)合性, associativities ):


    結(jié)合性     Meaning of $a ! $b ! $c
    =====     =========================
L   left      ($a ! $b) ! $c
R   right     $a ! ($b ! $c)
N   non       ILLEGAL
C   chain     ($a ! $b) and ($b ! $c)
X   list      infix:<!>($a; $b; $c)

對(duì)于一元操作符, 這解釋為:


    結(jié)合性     Meaning of !$a!
    =====     =========================
L   left      (!$a)!
R   right     !($a!)
N   non       ILLEGAL

(在標(biāo)準(zhǔn) Perl 中沒(méi)有能利用結(jié)合性的一元操作符脾拆,因?yàn)樵诿恳粌?yōu)先級(jí)級(jí)別中品腹, 標(biāo)準(zhǔn)操作符要么一貫地是前綴岖食,要么是后綴。)

注意列表結(jié)合性(X)只在同一操作符之間有效舞吭。如果兩個(gè)擁有不同列表結(jié)合性的操作符擁有相同的優(yōu)先級(jí)泡垃,它們彼此間就會(huì)被認(rèn)為是非結(jié)合性的,必須使用圓括號(hào)來(lái)消除歧義羡鸥。

S03-operators/precedence.t lines 211–245

例如蔑穴, X 交叉操作符和 Z 拉鏈操作符 都有 "list infix" 優(yōu)先級(jí),但是:

@a X @b Z @c

是非法的惧浴,它必須寫(xiě)成下面的任意一種:

(@a X @b) Z @c
@a X (@b Z @c)

如果僅有的列表結(jié)合性操作符的實(shí)現(xiàn)是二進(jìn)制的, 那么它會(huì)被當(dāng)作是右結(jié)合性的存和。
標(biāo)準(zhǔn)的優(yōu)先級(jí)層級(jí)嘗試和它們的結(jié)合性相一致, 但是用戶定義的操作符和優(yōu)先級(jí)級(jí)別可以在同一優(yōu)先級(jí)級(jí)別上混合右結(jié)合性和左結(jié)合性操作符。如果在同一個(gè)表達(dá)式中不小心使用了有沖突的操作符, 那么操作符彼此之間會(huì)被認(rèn)為是非結(jié)合性的, 并且必須使用圓括號(hào)來(lái)消除歧義。

如果你沒(méi)有在上面看見(jiàn)你喜歡的操作符, 下面的章節(jié)會(huì)包含所有按優(yōu)先級(jí)排列的操作符捐腿。這兒描述了基本的操作符纵朋。

Term precedence

這實(shí)際上不真的是優(yōu)先級(jí), 但是它在這里是因?yàn)闆](méi)有操作符的優(yōu)先級(jí)比 term 高. 查看 S02 獲取各種 terms 的更詳盡的描述. 這里有一些例子:

  • Int 字面量
42
  • Num 字面量
3.14
  • 不能插值的 Str 字面量
'$100'
  • 能插值的 Str 字面量
"Answer = $answer\n"
  • 通用的 Str 字面量
q["$100"]
qq["$answer"]
  • Heredoc
qq:to/END/
    Dear $recipient:
    Thanks!
    Sincerely,
    $me
    END
  • 數(shù)組構(gòu)造器
    [1,2,3]

[ ] 里面提供了列表上下文. 技術(shù)上講, 它實(shí)際上提供了一個(gè) semilist 上下文, 即一系列分號(hào)分割的語(yǔ)句, 每條語(yǔ)句都在列表上下文中解釋, 然后被連接成最終的列表.

  • 散列構(gòu)造器

    { }
    { a => 42 }

{ } 里面要么是空的, 要么是以 pair 或 散列 開(kāi)頭的單個(gè)列表, 否則你必須使用 hash( )%( ) 代替.

  • Closure
{ ... }

如果出現(xiàn)在語(yǔ)句那兒, 會(huì)立即執(zhí)行。 否則會(huì)延遲內(nèi)部作用域的求值茄袖。

  • 捕獲構(gòu)造器
\(@a,$b,%c)

代表還不知道它的上下文的參數(shù)列表的抽取,

  • 符號(hào)化變量
$x
@y
%z
$^a
$?FILE
&func
&div:(Int, Int --> Int)
  • 符號(hào)作為上下文化函數(shù)
$()
@()
%()
&()
  • quote-like 記號(hào)中的 Regexes
/abc/
rx:i[abc]
s/foo/bar/
  • 轉(zhuǎn)換
tr/a..z/A..Z/

注意范圍使用 .. 而非 -.

  • 類型名
Num
::Some::Package
  • 由圓括號(hào)環(huán)繞的子表達(dá)式
(1+2)
  • 帶括號(hào)的函數(shù)調(diào)用
a(1)

一個(gè)項(xiàng)后面立即跟著一個(gè)圓括號(hào)化的表達(dá)式總是被當(dāng)作函數(shù)調(diào)用操软, 即使那個(gè)標(biāo)識(shí)符也含有前綴意義, 所以那種情況下你從來(lái)不用擔(dān)心優(yōu)先級(jí)宪祥。因此:

not($x) + 1         # means (not $x) + 1
  • Pair 構(gòu)造器
:limit(5)
:!verbose
  • 簽名字面量
:(Dog $self:)
  • 使用隱式調(diào)用者的方法調(diào)用
.meth       # call on $_
.=meth      # modify $_

注意這只能出現(xiàn)在需要項(xiàng)(term)的地方聂薪。需要后綴的地方它就是后綴。如果需要中綴操作符(即, 在項(xiàng)后面, 之間是空格), .meth 就是語(yǔ)法錯(cuò)誤蝗羊。(.meth 形式在那兒是被允許的因?yàn)橛幸粋€(gè)和方法調(diào)用形式在語(yǔ)義上等價(jià)但是允許在 = 號(hào)和方法名之間于空格存在的特殊 .= 中綴賦值操作符)藏澳。

  • Listop (leftward)
4,3, sort 2,1       # 4,3,1,2

就像 Perl 5 中一樣, 列表操作符對(duì)于它左側(cè)的表達(dá)式看起來(lái)像一個(gè)項(xiàng)(term), 所以它比左側(cè)的逗號(hào)綁定的緊湊點(diǎn), 比右側(cè)的逗號(hào)綁定的松散點(diǎn)。-- 查看下面的列表前綴優(yōu)先級(jí)肘交。

方法后綴優(yōu)先級(jí)

所有的方法后綴都以一個(gè)點(diǎn)開(kāi)頭, 盡管對(duì)于下標(biāo)來(lái)說(shuō), 點(diǎn)號(hào)是可選的. 因?yàn)檫@些是最緊密的操作符, 你可以看到一系列方法調(diào)用作為單獨(dú)的項(xiàng), 這個(gè)項(xiàng)僅僅要表達(dá)一個(gè)復(fù)雜的名字.

  • 標(biāo)準(zhǔn)的單個(gè)分發(fā)方法調(diào)用
$obj.meth
  • 標(biāo)準(zhǔn)單個(gè)分發(fā)方法調(diào)用的變體
$obj.+meth
$obj.?meth
$obj.*meth

除了普通的 . 方法調(diào)用之外, 還有 .*, .?, 和 .+ 變體來(lái)控制如何處理多個(gè)同名的相關(guān)方法.

  • 類限定的方法調(diào)用
$obj.::Class::meth
$obj.Class::meth    # same thing, 假設(shè)預(yù)先定義了 Class

就跟 Perl 5 一樣, 告訴分發(fā)器(dispatcher)從哪個(gè)類開(kāi)始搜索, 而不正好是那個(gè)被調(diào)用的方法笆载。

  • 可變方法調(diào)用
$obj.=meth

.= 操作符執(zhí)行了對(duì)左側(cè)對(duì)象的就地修改。

  • 元方法調(diào)用
$obj.^meth

.^ 操作符調(diào)用了類的元方法(class metamethod); foo.^barfoo.HOW.bar 的簡(jiǎn)寫(xiě)涯呻。

  • 像方法一樣的后環(huán)綴
$routine.()
$array.[]
$hash.{}
$hash.<>
$hash.??

不帶點(diǎn)的這些形式有同樣的優(yōu)先級(jí).

  • 帶點(diǎn)形式的其它后綴操作符
$x.++         # postfix:<++>($x)
  • 帶點(diǎn)形式的其它前綴操作符
$x.:<++>       # prefix:<++>($x)
  • 有一個(gè)特殊的非中綴操作符 infix:<.> 所以
$foo . $bar

總是會(huì)返回編譯時(shí)錯(cuò)誤來(lái)標(biāo)示用戶應(yīng)該使用中綴操作符 infix<~> 代替凉驻。這用于捕獲正在學(xué)習(xí) Perl 6 的 Perl 5 程序員可能會(huì)犯的錯(cuò)誤。

自增優(yōu)先級(jí)

就像在 C 中一樣复罐,這些操作符增加或減少正在談?wù)摰哪莻€(gè)對(duì)象的值涝登,根據(jù)操作符在前面還是在后面。還是像 C 中一樣效诅,在同一個(gè)表達(dá)式中多個(gè)對(duì)單個(gè)可變對(duì)象的引用可能導(dǎo)致未定義行為除非顯式地插入了某些序列操作符胀滚。請(qǐng)查看 "Sequence points"。

至于 Perl 6 中得所有后綴操作符乱投,項(xiàng)(term) 和它的后綴之間不允許有空格咽笼。請(qǐng)查看 S02 來(lái)了解為什么,還有怎么使用 "unspace" 來(lái)應(yīng)急這個(gè)約束戚炫。

和可變方法一樣剑刑,所有這些操作符被分派為操作符數(shù)的類型并返回一個(gè)同類型的結(jié)果,但是只有(不可變的)值存儲(chǔ)在可變?nèi)萜髦袝r(shí)双肤,它們?cè)谥殿愋蜕喜攀呛戏ǖ氖┨汀H欢瑸榱酥С滞ㄓ玫牧?xí)語(yǔ)茅糜,一個(gè)裸的未定義值(在一個(gè)合適的標(biāo)量容器中)是被允許把自身修改成 Int 類型的:

say $x unless %seen{$x}++;

Str (在一個(gè)合適的容器中)的增加和 Perl 5 類似七芭,但是被稍微推廣了一點(diǎn)。Perl 6 會(huì)掃描前面不是 '.' 字符的字符串中得最后的字母數(shù)字序列蔑赘。不像 Perl 5 那樣狸驳,這個(gè)字母數(shù)字序列不需要錨定到字符串的開(kāi)頭预明,也不需要以字母數(shù)字符開(kāi)頭;字符串中匹配 <!after '.'> <rangechar>+ 字母數(shù)字的最后的序列被增加而不管它前面是什么锌历。

<rangechar> 字符類被定義為那種字符的子集(subset)贮庞,Perl 知道怎么在范圍(range)中增加它,就像下面定義的那樣:
額外的匹配增加了兩個(gè)好處:對(duì)于典型的增長(zhǎng)文件名的用法究西,你不必?fù)?dān)心路徑名或擴(kuò)展名:

$file = "/tmp/pix000.jpg";
$file++;                 # /tmp/pix001.jpg, 不是 /tmp/pix000.jph

也許更重要的是, 如果你恰好增長(zhǎng)了一個(gè)以小數(shù)結(jié)尾的字符串,Perl 6 也能應(yīng)對(duì)自如:

$num = "123.456";
$num++;             # 124.456, not 123.457

字符位置增加自然范圍內(nèi)任何Unicode范圍被認(rèn)為代表了數(shù)字0 . .9或被認(rèn)為是一個(gè)完整的周期性字母的(一例)(Unicode)腳本物喷。只在codepoints腳本,代表他們的字母表,形成一個(gè)周期獨(dú)立于其他字母可能使用卤材。(此規(guī)范延緩這種腳本的用戶,以確定適當(dāng)?shù)闹芷诘男偶?。我們?nèi)我舛xASCII字母不相交與其他腳本,使用范圍的字符,但是字母點(diǎn)綴ASCII字母是不允許的峦失。

如果在這樣一個(gè)范圍中當(dāng)前字符是字符串位置中最后的字符,它包裝的第一個(gè)字符范圍和發(fā)送一個(gè)“攜帶”的位置了,然后那個(gè)位置是增加的范圍扇丛。當(dāng)且僅當(dāng)最左邊的位置是筋疲力盡的范圍,一個(gè)額外的字符相同的范圍是插入到持有套利以相同的方式作為Perl 5,所以遞增(zz99)“變成”(aaa00)zz和遞增(99)“變成”(100 aa)”。

> my $a = "99zz"
> $a++           # 99zz
> $a++           # 100aa

> my $b = 'zz99'
> $b++           # zz99
> $b++           # aaa00

下面的 Unicode 范圍是某些可能的 rangechar 范圍尉辑。對(duì)于字母我們有這樣的范圍:

A..Z        # ASCII uc
a..z        # ASCII lc
'Α'..'Ω'    # Greek uc
α..ω        # Greek lc (presumably skipping C<U+03C2>, final sigma)
?..?        # 希伯來(lái)
  etc.      # (XXX out of my depth here)
> my @a =  'Α'..'Ω'  # Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ ? Σ Τ Υ Φ Χ Ψ Ω

對(duì)于數(shù)字我們有這樣的范圍:

    0..9         # ASCII
    ?..?         # 阿拉伯語(yǔ)-印度語(yǔ)
    ?..?         # 天城文
    ?..?         # 孟加拉語(yǔ)
    '?'..'?'    # 古木基文
    ?..?        # 古吉拉特文
    ?..?        # 奧里亞語(yǔ)

等等.

> my @b =    '?'..'?'   #  ? ? ? ? ? ? ? ? ? ?

某些其它非書(shū)寫(xiě)用的 0..9 范圍也可以被增長(zhǎng)帆精,例如:

    ?..?        # 上標(biāo) (note, cycle includes latin-1 chars)
    '?'..'?'    # 下標(biāo)
    0..9      # 全角數(shù)字
> my @f = '?'..'?' # ? ? ? ? ? ? ? ? ? ?
    Ⅰ..Ⅻ        # clock roman numerals uc
    ⅰ..?        # clock roman numerals lc
    ?..?       # circled digits/numbers 0..50
    ?..?        # parenthesized lc
    ?..?        # die faces 1..6
    '?'..'?'        # dingbat negative circled 1..10

etc.

注意: 對(duì)于 Perl 中實(shí)際的范圍, 你需要把上面的字符用引號(hào)括起來(lái):

'?'..'?'   # circled digits/numbers 0..50
my @d = '?'..'?'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
my @e = '?'..'?' # ? ? ? ? ? ? ? ? ? ?

If you want to future-proof the top end of your range against further Unicode additions, you may specify it as "whatever":

'?'..*      # circled digits/numbers up to current known Unicode max

prefix:<|>, 將對(duì)象展開(kāi)為參數(shù)列表

| $capture

把Capture 值的內(nèi)容(或 Capture-like)插值進(jìn)當(dāng)前的參數(shù)列表中, 就像它們被字面地指定那樣隧魄。

prefix:<||>, 將對(duì)象展開(kāi)為分號(hào)列表

|| $parcel

把 Parcel(或其它有順序的值)的元素插值到當(dāng)前參數(shù)列表中就像它們被字面地指定一樣, 由分號(hào)分割, 即, 以多維級(jí)別卓练。在列表中的列表上下文之外使用該操作符是錯(cuò)誤的; 換句話說(shuō), 它必須被綁定到 **(slice)參數(shù)上而非吞噬參數(shù)*上。

infix:<div>, 整除

$numerator div $denominator
> 3 div 2     # 1
> 13 div 2    # 6

> 13 div 2.4

報(bào)錯(cuò):

Cannot call infix:<div>(Int, Rat); none of these signatures match:
    (Int:D \a, Int:D \b)
    (int $a, int $b --> int)
  in block <unit> at <unknown file>:1

infix:<%>, modulo

$x % $y

重復(fù)操作符

infix:<x>, 字符串/緩沖區(qū) 復(fù)制(或者重復(fù)/拷貝)

$string x $count

在字符串上下文中計(jì)算左邊的參數(shù)购啄,重復(fù)結(jié)果字符串值由右側(cè)參數(shù)指定的倍數(shù)次襟企,然后不管上下文,把結(jié)果作為單個(gè)連接好的字符串返回狮含。

如果重復(fù)次數(shù)小于 1顽悼,則返回空字符串。重復(fù)次數(shù)不可以是 *几迄,因?yàn)?Perl 6 不支持無(wú)窮字符串蔚龙。(至少,還沒(méi)有...)然而注意映胁,有一天無(wú)窮字符串可能使用 cat($string xx *) 來(lái)模仿木羹,在這種情況下,$string x * 可能是它的簡(jiǎn)寫(xiě)屿愚。

'a' x *;              # WhateverCode.new()
my $a = 'a' x *;      # WhateverCode.new()
say $a;               # WhateverCode.new()
say $a(12);           # 可以傳遞參數(shù)汇跨!, 結(jié)果為 aaaaaaaaaaaa

infix:<xx>, 表達(dá)式重復(fù)操作符

@list xx $count  # 如果 $count  是 * ,則返回一個(gè)無(wú)限列表 (懶惰的妆距,因?yàn)榱斜砟J(rèn)是懶惰的 )
rand xx *;                # infinite supply of random numbers
[ 0 xx $cols ] xx $rows   # distinct arrays, not the same row replicated
> my @random= rand xx *;
> @random[0]                # 0.510689533871727
> @random[0]                # 0.510689533871727
> @random[1]                # 0.993102039714483
> @random[2]                # 0.177400471499773
> @random[12]

字符串連接

infix:<~>, 字符串 /緩沖 連接

$x ~ $y

范圍對(duì)象創(chuàng)建

$min .. $max
$min ^.. $max
$min ..^ $max
$min ^..^ $max

逗號(hào)操作符優(yōu)先級(jí)

  • infix:<,> 參數(shù)分隔符
1, 2, 3, @many

不像 Perl5 穷遂,逗號(hào)操作符從來(lái)不返回最后一個(gè)值(在標(biāo)量上下文中它返回一個(gè)列表)

  • infix:<:>, 調(diào)用者標(biāo)記
say $*OUT: "howdy, world"  # howdy, world
say($*OUT: "howdy, world") # howdy, world
push @array: 1,2,3
push(@array: 1,2,3)
\($object: 1,2,3, :foo, :!bar)

冒號(hào)操作符就像逗號(hào)那樣解析,但是它把左邊的參數(shù)標(biāo)記為調(diào)用者娱据,這會(huì)把函數(shù)調(diào)用轉(zhuǎn)換為方法調(diào)用蚪黑。它只能在參數(shù)列表或捕獲的第一個(gè)參數(shù)身上使用盅惜,用在其它地方會(huì)解析失敗。當(dāng)用在捕獲中時(shí)忌穿,尚不知道?捕獲會(huì)被綁定到哪個(gè)簽名上抒寂;如果綁定到一個(gè)非方法的簽名身上,調(diào)用者僅僅轉(zhuǎn)換成第一個(gè)位置參數(shù)掠剑,就像冒號(hào)是一個(gè)逗號(hào)一樣屈芜。

為了避免和其它的冒號(hào)形式混淆,冒號(hào)中綴操作符后面必須跟上空格或終止符朴译。它前面可以有空格也可以沒(méi)有空格井佑。

注意:在下面把中綴操作符和冒號(hào)區(qū)別開(kāi):

@array.push: 1,2,3
@array.push(1,2,3): 4,5,6
push(@array, 1,2,3): 4,5,6

這是把普通函數(shù)或方法轉(zhuǎn)換為列表操作符的特殊形式。 這種特殊形式只在點(diǎn)語(yǔ)法形式的方法調(diào)用后被識(shí)別眠寿, 或者在方法或函數(shù)調(diào)用的右圓括號(hào)之后被識(shí)別躬翁。這種特殊形式不允許其間有空格,但是下一個(gè)參數(shù)的前面要有空格盯拱。如果可能的話在所有其它情況下盒发,冒號(hào)會(huì)被解析為副詞的開(kāi)始,否則會(huì)被解析為調(diào)用者標(biāo)記(上面描述的中綴操作符狡逢。)

這種特殊形式不允許介于中間的空格宁舰, 但是允許在下一個(gè)參數(shù)之前有空格。 在所有情況下甚侣, 冒號(hào)會(huì)被盡可能地解析為副詞的開(kāi)頭明吩,或者調(diào)用者標(biāo)記者(上面描述的中綴)

冒號(hào)的另一種特殊方式是, 允許正好在參數(shù)列表的右側(cè)圓括號(hào)之后為圓括號(hào)括住的參數(shù)列表添加 listop 參數(shù),附帶條件是你被允許把 .foo(): 1,2,3 縮短為 .foo: 1,2,3.(但是僅限于方法調(diào)用殷费, 因?yàn)槠胀ǖ暮瘮?shù)不需要把處于第一個(gè)位置的冒號(hào)轉(zhuǎn)換為 listop印荔, 空格就夠了。 如果你嘗試使用冒號(hào)擴(kuò)展函數(shù)名最好把它看作標(biāo)簽详羡。)

foo $obj.bar: 1,2,3     # special, means foo($obj.bar(1,2,3))
foo $obj.bar(): 1,2,3   # special, means foo($obj.bar(1,2,3))
foo $obj.bar(1): 2,3    # special, means foo($obj.bar(1,2,3))
foo $obj.bar(1,2): 3    # special, means foo($obj.bar(1,2,3))
foo($obj.bar): 1,2,3    # special, means foo($obj.bar, 1,2,3)
foo($obj.bar, 1): 2,3   # special, means foo($obj.bar, 1,2,3)
foo($obj.bar, 1,2): 3   # special, means foo($obj.bar, 1,2,3)
foo $obj.bar : 1,2,3    # infix:<:>, means $obj.bar.foo(1,2,3)
foo ($obj.bar): 1,2,3   # infix:<:>, means $obj.bar.foo(1,2,3)
foo $obj.bar:1,2,3      # 語(yǔ)法錯(cuò)誤
foo $obj.bar :1,2,3     # 語(yǔ)法錯(cuò)誤
foo $obj.bar :baz       # 副詞, means foo($obj.bar(:baz))
foo ($obj.bar) :baz     # 副詞, means foo($obj.bar, :baz)
foo $obj.bar:baz        # extended identifier, foo( $obj.'bar:baz' )
foo $obj.infix:<+>      # extended identifier, foo( $obj.'infix:<+>' )
foo: 1,2,3              # label at statement start, else infix

這個(gè)故事的寓意是:如果你不知道冒號(hào)是怎樣結(jié)合的仍律,就使用空格或圓括號(hào)讓它清晰。

  • List infix precedence 列表中綴優(yōu)先級(jí)

列表中綴操作符都有列表結(jié)合性实柠,這意味著水泉,同一個(gè)中綴操作符是同步起作用的,而不是一個(gè)接著一個(gè)窒盐。不同的操作符被認(rèn)為是非結(jié)合性的草则,為了明確,必須用括號(hào)括起來(lái)蟹漓。

  • infix:<Z>, the zip operator
    1,2 Z 3,4   # (1,3),(2,4)
> 2,5,7 [Zmin] 3,4,5     # 兩兩比較, 2 4 5
> my @a=3,6,9            # 3 6 9
> my @b=4,5,10           # 4 5 10
> @a [Zmin] @b           # 3 5 9
> my @a = (1,2,9,3,5)    # 1 2 9 3 5
> my @b = (2,3,5,1,9)    # 2 3 5 1 9
> my @c = (2,3,4,5,1)    # 2 3 4 5 1
> @a [Zmin] @b [Zmin] @c # 1 2 4 1 1
> @a [Zmax] @b [Zmax] @c # 2 3 9 5 9
  • infix:<minmax>, minmax 操作符
@a minmax @b

返回@a和@b中最小值和最大值的一個(gè)范圍炕横。

> my @a = 2,4,6,8;
> my @b = 1,3,5,7,9;
> @a minmax @b         # 1..9
  • infix:<X>, 交叉操作符

S03-metaops/cross.t lines 6–19

1,2 X 3,4          # (1,3), (1,4), (2,3), (2,4)

和 zip 操作符相比, X 操作符返回元素交叉后的列表葡粒。例如份殿,如果只有 2 個(gè)列表膜钓,第一個(gè)列表中取一個(gè)元素和第二個(gè)列表中取一個(gè)元素組成 pair 對(duì)兒,第二個(gè)元素變化的最迅速卿嘲。

最右邊的列表先遍歷完颂斜。因此, 你寫(xiě):

<a b> X <1 2>

你會(huì)得到:

('a', '1'), ('a', '2'), ('b', '1'), ('b', '2')

這在平的上下文會(huì)變成一個(gè)展平的列表拾枣,在 list of list 上下文中會(huì)變成列表中的列表

say flat(<a b> X <1 2>).perl    #  ("a", "1", "a", "2", "b", "1", "b", "2").list
say lol(<a b> X <1 2>).perl     # (("a", "1"), ("a", "2"), ("b", "1"), ("b", "2"))

這個(gè)操作符是列表結(jié)合性的沃疮,所以:

1,2 X 3,4 X 5,6

生成

(1,3,5),(1,3,6),(1,4,5),(1,4,6),(2,3,5),(2,3,6),(2,4,5),(2,4,6)

另一方面,如果任一列表為空梅肤,你會(huì)得到一個(gè)空列表忿磅。

盡管X兩邊的列表可能是無(wú)限的,在操作符 X的右邊使用無(wú)限列表可能會(huì)產(chǎn)生意想不到的結(jié)果凭语,例如:

<a b> X 0..*

會(huì)產(chǎn)生

('a',0), ('a',1), ('a',2), ('a',3), ('a',4), ('a',5), ...

并且你絕對(duì)不會(huì)到達(dá) 'b'。如果你左側(cè)的列表只包含單個(gè)元素撩扒,然而似扔,這可能有用,尤其是如果 X 用作元操作符時(shí)搓谆〕椿裕看下面。

say lol(<a b> X <1 2>).perl    # ("a", "1", "a", "2", "b", "1", "b", "2")

Cross metaoperators 交叉操作符

@files X~ '.' X~ @extensions
1..10 X* 1..10
@x Xeqv @y

等等

一個(gè)常見(jiàn)的用法是讓一個(gè)列表只含有單個(gè)元素在操作符 X 的一邊或另一邊:

@vector X* 2;                 # 每個(gè)元素都乘以 2
$prefix X~ @infinitelist;     # 在無(wú)限列表的每個(gè)元素前面前置一個(gè)元素
> my $prefix = ' - '
> my @a =<1 2 3 4 5>
> $prefix X~ @a       #  - 1  - 2  - 3  - 4  - 5

這時(shí)右邊有一個(gè)無(wú)限列表是可以的泉手。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末黔寇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斩萌,更是在濱河造成了極大的恐慌缝裤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颊郎,死亡現(xiàn)場(chǎng)離奇詭異憋飞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)姆吭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)榛做,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人内狸,你說(shuō)我怎么就攤上這事检眯。” “怎么了昆淡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵锰瘸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瘪撇,道長(zhǎng)获茬,這世上最難降的妖魔是什么港庄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮恕曲,結(jié)果婚禮上鹏氧,老公的妹妹穿的比我還像新娘。我一直安慰自己佩谣,他們只是感情好把还,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著茸俭,像睡著了一般吊履。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上调鬓,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天艇炎,我揣著相機(jī)與錄音,去河邊找鬼腾窝。 笑死缀踪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虹脯。 我是一名探鬼主播驴娃,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼循集!你這毒婦竟也來(lái)了唇敞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咒彤,失蹤者是張志新(化名)和其女友劉穎疆柔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蔼紧,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婆硬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奸例。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彬犯。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖查吊,靈堂內(nèi)的尸體忽然破棺而出谐区,到底是詐尸還是另有隱情,我是刑警寧澤逻卖,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布宋列,位于F島的核電站,受9級(jí)特大地震影響评也,放射性物質(zhì)發(fā)生泄漏炼杖。R本人自食惡果不足惜灭返,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坤邪。 院中可真熱鬧熙含,春花似錦、人聲如沸艇纺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)黔衡。三九已至蚓聘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盟劫,已是汗流浹背夜牡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侣签,地道東北人氯材。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像硝岗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袋毙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 操作符 操作符優(yōu)先級(jí) 在像 1 + 2 * 3 這樣的表達(dá)式中型檀, 2 * 3 被首先計(jì)算, 因?yàn)橹芯Y操作符 * ...
    焉知非魚(yú)閱讀 1,376評(píng)論 0 1
  • 范圍和范圍迭代器語(yǔ)法 .. 范圍操作符有各種在兩端帶有 ^符號(hào)的變體以表明把那個(gè)端點(diǎn)排除在范圍之外听盖。 它總會(huì)產(chǎn)生一...
    焉知非魚(yú)閱讀 833評(píng)論 0 0
  • 標(biāo)題: Rakudo and NQP Internals子標(biāo)題: The guts tormented imple...
    焉知非魚(yú)閱讀 1,342評(píng)論 1 3
  • 允許的修飾符 有些修飾符能在所有允許的地方出現(xiàn), 但并非所有的都這樣. 通常, 影響 regex 編譯的修飾符(...
    焉知非魚(yú)閱讀 1,322評(píng)論 0 1
  • 第一章 概要 Comming soon! 第二章 基礎(chǔ) 假設(shè)有一場(chǎng)乒乓球比賽胀溺,比賽結(jié)果以這種格式記錄:Player...
    焉知非魚(yú)閱讀 330評(píng)論 0 0