为什么Perl控制语句需要括号?

时间:2009-12-09 21:01:42

标签: perl syntax language-design

这可能看起来像是why Perl doesn't allow one-liners to be "unblocked,"最近提出的问题,但我发现这个问题的答案不能令人满意,因为他们要么提到the syntax documentation that says that braces are required,我认为这只是提出问题,或者忽略了这个问题并简单地提供了无选择的替代品。

为什么Perl需要大括号来控制语句,如 if for ?换句话说,为什么Perl需要块而不是语句,就像其他流行语言允许的那样?

8 个答案:

答案 0 :(得分:25)

一个原因可能是某些样式要求你应该总是使用带有控制结构的大括号,即使是一个衬里,以避免以后破坏它们,例如:

if (condition) 
   myObject.doSomething();
else 
   myObject.doSomethingElse();

然后有人在第一部分添加了更多内容:

if (condition)
   myObject.doSomething();
   myObject.doSomethingMore(); // Syntax error next line
else 
   myObject.doSomethingElse();

或者更糟:

if (condition)
   myObject.doSomething();
else 
   myObject.doSomethingElse();
   myObject.doSomethingMore(); // Compiles, but not what you wanted.

在Perl中,这些类型的错误是不可能的,因为不使用带控制结构的大括号总是语法错误。实际上,已在语言语法级别强制执行样式决策。

这是否是真正的原因的任何部分,只有拉里的小胡子知道。

答案 1 :(得分:18)

一个原因可能是某些构造在没有大括号的情况下会模棱两可:

foreach (@l) do_something unless $condition;

unless $condition是否适用于整个事件或do_something声明?

当然这可以通过优先规则或其他方法来解决, 但它可能是另一种创建令人困惑的Perl代码的方法: - )

答案 2 :(得分:11)

无括号if-else子句的一个问题是它们会导致语法模糊:

if (foo)
    if (bar)
       mumble;
    else
       tumble;

鉴于上述情况,在什么条件下执行?它可以被解释为在!foofoo && !bar时发生。添加大括号可以消除歧义,而不会过多地污染源。然后你可以继续说,拥有大括号总是一个好主意,所以让我们让语言需要它并解决无论是否应该使用它的无休止的C争吵。或者,当然,您可以通过完全去掉大括号并使用缩进来指示嵌套来解决问题。两者都是使清晰,明确的代码成为自然事物而不需要特别努力的方法。

答案 3 :(得分:8)

在Perl编程(Larry Wall共同撰写),第3版,第113页,复合语句是用表达式和块来定义的,而不是语句,而且块有大括号。

  

请注意,与C和Java不同,   [复合语句]定义于    BLOCKS 的条款,而不是语句。   这意味着大括号是   需要 - 没有悬而未决的陈述   允许的。

我不知道这是否能回答你的问题,但似乎在这种情况下,他选择支持简单的语言结构而不是例外。

答案 4 :(得分:6)

或许与您关于(可能)Perl 5及更早版本的问题没有直接关系,但是......

在Perl 6中,控制结构不需要括号:

if $x { say '$x is true' }

for <foo bar baz> -> $s { say "[$s]" }

如果括号也是可选的,那将是非常模糊的。

答案 5 :(得分:6)

是不是Perl允许你跳过括号,但是你必须在条件之前写下声明?即。

#!/usr/bin/perl

my $a = 1;

if ($a == 1) {
    print "one\n";
}

# is equivalent to:

print "one\n" if ($a == 1);

答案 6 :(得分:3)

好的,通常情况下,你需要在块周围使用大括号,但是如果块只有一个语句长,则不需要,当然,除非你的语句是以一种由优先规则统治的方式不明确的如果你省略了括号,就不像你想要的那样 - 在这种情况下,你也可以想象括号的使用,但这会不一致,因为它毕竟是一个块 - 这当然取决于各自的优先级在任何情况下,你不需要在关闭大括号后加分号 - 如果你结束一个if语句后跟一个else语句甚至是错误的 - 除了你绝对必须在结尾处加一个分号C ++中的头文件(或者它是C?)。

说真的,我很高兴代码中的每一个明确性和统一性。

答案 7 :(得分:0)

只是在这里猜测,但是“解锁”循环/ ifs / etc。往往是在代码维护期间引入细微错误的地方,因为一个草率的维护者可能会尝试在“循环内”添加另一行而不会意识到它不是真正

当然,这是我们正在谈论的Perl,所以可能任何依赖于可维护性的争论都是可疑的......:)