代码之家  ›  专栏  ›  技术社区  ›  Eric Strom

为什么Perl发出的“使用不带括号的”shift“警告不明确?

  •  12
  • Eric Strom  · 技术社区  · 15 年前

    是否有人知道为以下代码发出“使用不带括号的”SHIFT“不明确”警告的解析或优先级决定是什么?

    shift . 'some string';
    
    # and not
    
    (shift) . 'some string'; # or
    shift() . 'some string';
    

    这是为了让某些句法结构更容易吗?或者它仅仅是Perl解析器工作方式的产物?

    注意:这是一个关于语言设计的讨论,不是一个建议的地方。

    "@{[shift]}some string"
    
    2 回复  |  直到 15 年前
        1
  •  26
  •   Sinan Ünür    15 年前

    use diagnostics ,您会收到有用的消息:

        Warning: Use of "shift" without parentheses is ambiguous at (eval
            9)[/usr/lib/perl5/5.8/perl5db.pl:628] line 2 (#1)
        (S ambiguous) You wrote a unary operator followed by something that
        looks like a binary operator that could also have been interpreted as a
        term or unary operator.  For instance, if you know that the rand
        function has a default argument of 1.0, and you write
    
            rand + 5;
    
        you may THINK you wrote the same thing as
    
            rand() + 5;
    
        but in actual fact, you got
    
            rand(+5);
    
        So put in parentheses to say what you really mean.
    

    担心的是你会写一些 shift .5 它将被解析为 shift(0.5) .

        2
  •  8
  •   ysth    15 年前

    模棱两可并不意味着真正的模棱两可,只是在解析器确定的范围内模棱两可。 shift . 尤其是“模棱两可”,因为 . 可以开始一个术语(例如 .123 )或者操作员, 因此,它还不足以决定接下来的是shift的操作数还是shift()作为操作数的运算符(而解析器也不够聪明,无法知道:a)shift()作为 . 这不是一个学期的开始还是b) 123 不是有效的移位操作数)。