在perl中,括号用于覆盖优先级(如在大多数编程语言中)以及用于创建列表。如何判断一对特定的parens是否会被视为分组构造或单元素列表?
例如,我很确定这是标量而不是单元素列表:(1 + 1)
但是更复杂的表达呢?有一种简单的方法可以说明吗?
答案 0 :(得分:16)
这里有三个关键原则:
背景为王。您的示例(1 + 1)
的评估取决于具体情况。
$x = (1 + 1); # Scalar context. $x will equal 2. Parentheses do nothing here.
@y = (1 + 1); # List context. @y will contain one element: (2).
# Parens do nothing (see below), aside from following
# syntax conventions.
在标量上下文中,没有列表这样的东西。要查看此内容,请尝试将出现的指定为标量变量的列表。考虑这一点的方法是关注逗号运算符的行为:在标量上下文中,它计算其左参数,抛出该值,然后计算其右参数,并返回该值。在列表上下文中,逗号运算符将两个参数都插入到列表中。
@arr = (12, 34, 56); # Right side returns a list.
$x = (12, 34, 56); # Right side returns 56. Also, we get warnings
# about 12 and 34 being used in void context.
$x = (@arr, 7); # Right side returns 7. And we get a warning
# about using an array in a void context.
括号不会创建列表。逗号运算符创建列表(假设我们在列表上下文中)。在Perl代码中键入列表时,出于优先级原因需要使用括号 - 而不是出于列表创建原因。几个例子:
圆括号没有效果:我们正在用标量计算数组 上下文,所以右侧返回数组大小。
$x = (@arr);
创建包含一个元素的列表不需要括号。
@arr = 33; # Works fine, with @arr equal to (33).
但是出于优先原因,需要使用多个项目的括号。
@arr = 12, 34, 56; # @arr equals (12). And we get warnings about using
# 34 and 56 in void context.
答案 1 :(得分:8)
示例:
$x = 1 + 1; # $x is 2.
$x = (1 + 1); # $x is 2.
@x = 1 + 1; # @x is (2).
@x = (1 + 1); # @x is (2).
$x = (1 + 1, 1 + 2); # $x is 3.
@x = (1 + 1, 1 + 2); # @x is (2, 3).
粗略地说,在列表上下文中,逗号运算符分隔列表的项目;在标量上下文中,逗号运算符是C“串行逗号”,它评估其左侧和右侧,并返回右侧的值。在标量上下文中,括号将表达式组覆盖以覆盖操作的顺序,并且在列表上下文中,括号表示......完全相同的事情。它们与分配数组相关的原因是:
# Comma has precedence below assignment.
# @a is assigned (1), 2 and 3 are discarded.
@a = 1, 2, 3;
# @a is (1, 2, 3).
@a = (1, 2, 3);
至于你的问题“它是标量还是单元素列表”,由于上下文的原因,单独询问表达式并不是一个有意义的问题。在列表上下文中,一切都是列表;在标量语境中,什么都没有。