如何判断Perl代码中的一组parens是作为分组parens还是组成一个列表?

时间:2010-05-22 02:43:08

标签: perl list grouping parentheses

在perl中,括号用于覆盖优先级(如在大多数编程语言中)以及用于创建列表。如何判断一对特定的parens是否会被视为分组构造或单元素列表?

例如,我很确定这是标量而不是单元素列表:(1 + 1)
但是更复杂的表达呢?有一种简单的方法可以说明吗?

2 个答案:

答案 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)

  1. 上下文。
  2. 括号中没有您认为他们在创建列表时所具有的角色。
  3. 示例:

    $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);
    

    至于你的问题“它是标量还是单元素列表”,由于上下文的原因,单独询问表达式并不是一个有意义的问题。在列表上下文中,一切都是列表;在标量语境中,什么都没有。

    推荐阅读:perlopperldata编程Perl