优先级

一元运算符总是比任意二元运算符结合性更强: $a + b 是 ($a) + b 而不是 $(a + b) 。

如果一个一元运算符的第一个字符是 @ ,它就是一个 sigil-like 运算符,比 primarySuffix 的结合性更强: @x.abc 被解析为 (@x).abc ,而 $x.abc 被解析为 $(x.abc) 。

对于不是关键字的二元运算符,优先级由以下规则决定:

以 -> 、 ~> 或 \=> 结尾的运算符被称为 arrow like “箭头”,在所有运算符中优先级最低。

如果运算符以 \= 结尾,并且其第一个字符不是 <, >, !, \=, ~, ? 中的任意一个,那么它就是一个 赋值运算符 ,具有第二低的优先级。

否则,优先级由第一个字符决定。

优先级运算符第一个字符终结符号
10 (最高)$ ^OP10
9 / div mod shl shr % % \ /OP9
8+ -+ - ~ |OP8
7&&OP7
6...OP6
5== <= < >= > != in notin is isnot not of as from= < > !OP5
4andOP4
3or xorOP3
2@ : ?OP2
1赋值运算符 (如 +=, *=)OP1
0 (最低)箭头运算符 (like ->, =>)OP0

一个运算符是否被用作前缀,会受到前置空格影响 (这个解析变化是在 0.13.0 版本中引入的) 。

  1. echo $foo
  2. # 解析为
  3. echo($foo)

空格也决定了 (a, b) 是被解析为调用的参数列表,还是被解析为元组构造。

  1. echo(1, 2) # 把 1 和 2 传递给 echo
  1. echo (1, 2) # 把 tuple (1, 2) 传递给 echo