Perl中的逗号在所有上下文中都是关联的吗?



假设E,FG是不包含比逗号优先级高的操作符的表达式。表达式((E, F), G)(E, (F, G))在标量、列表和/或void上下文中是否相等?更准确地说,您是否总是用(E, (F, G))替换((E, F), G),反之亦然,而不会影响程序的执行?

上下文不影响代码的解析方式。

逗号/列表操作符保证从左到右计算每个操作数(与上下文无关)。

[1] 从这个和更多的信息,我们可以证明E, F, G,( E, F ), GE, ( F, G )是等价的。

既然你特别提到了上下文,我们将更详细地研究它。

对于void, list或indeterminate[2]contextc,在所有情况下,每个项都得到相同的contextc

c               c                 c
-------       -----------       -----------
c  c  c          c      c       c     c
-  -  -       --------  -       -  --------
c  c                 c  c
-  -                 -  -
E, F, G       ( E, F ), G       E, ( F, G )

对于标量上下文(s),除最后一项外,在所有情况下都得到void context (v)。

s               s                 s
-------       -----------       -----------
v  v  s          v      s       v     s
-  -  -       --------  -       -  --------
v  v                 v  s
-  -                 -  -
E, F, G       ( E, F ), G       E, ( F, G )

  1. 我希望能够说它们编译相同,但是它们没有。尽管文档说它是一个二进制运算符,但它被实现为一个n进位运算符。parent会导致创建操作符的另一个实例(在示例中有效地使其成为二进制操作符)。

  2. 当它是子表达式的最后一个表达式时,上下文只在运行时才知道,我称之为"不确定"。除了标量上下文中的列表/逗号操作符之外,这没有什么区别。运行时上下文被传播到每个操作数,因此如果只在运行时知道,则得到s,s,s,尽管如果上下文在编译时已知,则得到v,v,s

    正如你在上面看到的,这并不影响答案。E, F, G,( E, F ), GE, ( F, G )是等价的,无论上下文在编译时是否已知。

相关内容

最新更新