【问题标题】:Why must 'if' clause in Perl come with either curly brackets or nothing?为什么 Perl 中的“if”子句必须带有大括号或什么都不带?
【发布时间】:2011-07-28 14:17:35
【问题描述】:

没关系:

if ($some_var==$some_value) {}

这也可以:

print "hello" if ($some_var==$some_value);

但这会引发错误:

if ($some_var==$some_value) print "some_message";

为什么 Perl 中的 'if' 子句必须带有大括号或什么都不带?

【问题讨论】:

  • 你很困惑。它不能一无所有。大括号是强制性的。并且有充分的理由。
  • 如果你想要一个不占用块的if 语句,为什么不使用and,就像$some_var == $some_value and print "some message"; 一样,它类似于if 的语句修饰符形式,但参数颠倒了.

标签: perl if-statement syntax


【解决方案1】:

为了避免编译器构造中众所周知的“悬空 else”问题。见http://en.wikipedia.org/wiki/Dangling_else

【讨论】:

    【解决方案2】:

    Perl 的语法相当复杂,而且很难解析。我认为大括号在 if 子句之后是强制性的,以消除歧义并使 Perl 代码更易于解析。

    【讨论】:

    • 消除歧义,是的,但不容易解析;解析器(以前的 yacc,现在的 bison)可以简单地更改为不需要 {}。
    • 好吧,Larry 一直在谈论他如何重构语法以减少产生式的数量以处理 Perl 语法。这就是我所说的易于解析的意思:产品的设计。
    • 之所以这样做是因为大括号是可选的,这是因为烦人的 C 错误。使它们成为非可选可以解决该错误。
    • 我已经编程了 20 多年。在那段时间里,我犯了很多很多的编码错误。为 if 语句弄乱 else 或忘记依赖块的括号必须是我做过的最罕见的事情之一。人们真的很难做到这一点吗????!
    【解决方案3】:

    perl 语法就是这样定义的。 if (expr) BLOCK 语法需要一个块,而不是一个语句。请参阅perlsyn(“复合语句”部分)。

    摘录:

    if 语句很简单。因为 BLOCK 总是被大括号包围,所以永远不会有任何歧义来判断 if 和 else 的搭配。

    【讨论】:

      【解决方案4】:

      if ($some_var==$some_value); 在我尝试时不是“也可以”(我也没想到会这样)。

      为什么需要 BLOCK 而不允许使用普通的 EXPR?因为这就是拉里想要的。

      【讨论】:

      • 如果前面有声明print "hello!" if ($foo);,那“没关系”。
      • 哎呀,对不起,这个“如果(子句);”不行
      • 哦是的,但是 [print "hello" if (1==1);" 没问题]
      • @nicola:将语句修饰符与控制流结构混合在一起,您完全没有抓住重点。
      【解决方案5】:

      我不知道卷曲,但拉里提到 parens 可以是可选的。我相信他决定不这样做是为了保持代码的可读性。

      【讨论】:

        【解决方案6】:

        我相信它根本不受支持,但这是:print "some_message" if($some_var == $some_value);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          • 2017-02-06
          • 2020-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多