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

Rob*_*edy 24 syntax perl language-design

这可能看起来像是最近的一个问题,问为什么Perl不允许单行"被解锁",但我发现这个问题的答案不能令人满意,因为他们要么提到语法文档说需要括号,我就是认为只是乞求这个问题,或者忽略了这个问题而只是简单地给出了无用的选择.

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

Ada*_*ire 25

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

if (condition) 
   myObject.doSomething();
else 
   myObject.doSomethingElse();
Run Code Online (Sandbox Code Playgroud)

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

if (condition)
   myObject.doSomething();
   myObject.doSomethingMore(); // Syntax error next line
else 
   myObject.doSomethingElse();
Run Code Online (Sandbox Code Playgroud)

或者更糟:

if (condition)
   myObject.doSomething();
else 
   myObject.doSomethingElse();
   myObject.doSomethingMore(); // Compiles, but not what you wanted.
Run Code Online (Sandbox Code Playgroud)

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

无论这是真正原因的任何一部分,只有拉里的小胡子知道.

  • @Rob:"防止程序员错误"正是答案.许多看起来有点偏离C的东西来自Larry明确地从C编码中避免了这些问题.我没有你的参考,因为我大多只是直接从拉里的嘴里听到它. (15认同)
  • @Rob:你在开玩笑吧?拉里是一名C程序员.他可能比你或者我想要考虑的更多次看到这个错误.他为什么不决定用他设计的语言排除它,为什么时间与它有关呢? (8认同)
  • "防止程序员错误"似乎不是一个非常"Perlish"的原因,至少在语法建立时并非如此. (6认同)
  • @Rob:我认为你的论点走向了错误的方向,Perl的现代流行观点正在影响你的判断.认为一个人想出一种不考虑防止错误的语言是荒谬的.几十年后,在Perl中更容易出现错误:**这是一个不幸的副作用. (6认同)
  • 在我看来,有很多*其他*的地方很容易在Perl中犯错误; 和*这*是华尔选择解决的问题?至于时间,我觉得可维护性和初学者的价值比20年前更有价值,所以我觉得有点难以相信这会被包含在*那些*作为目标.(幸运的副作用,很好,但不是主要动机.) (2认同)

Jér*_*nig 18

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

foreach (@l) do_something unless $condition;
Run Code Online (Sandbox Code Playgroud)

unless $condition适用于整个事情还是只适用于do_something声明?

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

  • 这不是一个真正的缩写.那些backronyms只是为了好玩; Perl这个名字本身来自Pearl的故意拼写偏差. (3认同)

ara*_*nid 11

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

if (foo)
    if (bar)
       mumble;
    else
       tumble;
Run Code Online (Sandbox Code Playgroud)

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

  • 我似乎记得拉里在回答同一个问题的一个演讲中指出了这个案例. (4认同)

Phi*_*hil 8

在Programming Perl(Larry Wall共同撰写),第3版,第113页中,复合语句是根据表达式和块来定义的,而不是语句,而块有大括号.

请注意,与C和Java不同,[复合语句]是根据BLOCKS而不是语句定义的.这意味着需要括号 - 不允许悬挂声明.

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

  • 它也会支持(虽然没有证明)他想在我们的答案中排除Drew Hall和我提到的错误的概念...... (2认同)

eph*_*ent 6

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

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

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

for <foo bar baz> -> $s { say "[$s]" }
Run Code Online (Sandbox Code Playgroud)

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


el.*_*ado 6

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

#!/usr/bin/perl

my $a = 1;

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

# is equivalent to:

print "one\n" if ($a == 1);
Run Code Online (Sandbox Code Playgroud)

  • 有点惊讶没有其他人提起这件事.是的,"语句修饰符"是Perl对无块条件的回答.它们允许一个人在一行中写出条件,并把你正在做的事情放在第一位,因为有时候更重要的是要强调什么时候做什么或多少次. (2认同)