Rob*_*edy 24 syntax perl language-design
这可能看起来像是最近的一个问题,问为什么Perl不允许单行"被解锁",但我发现这个问题的答案不能令人满意,因为他们要么提到语法文档说需要括号,我就是认为只是乞求这个问题,或者忽略了这个问题而只是简单地给出了无用的选择.
为什么Perl需要大括号来控制语句,如if和for?换句话说,为什么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中,这些类型的错误是不可能的,因为不使用带控制结构的大括号总是语法错误.实际上,已在语言语法级别强制执行样式决策.
无论这是真正原因的任何一部分,只有拉里的小胡子知道.
Jér*_*nig 18
一个原因可能是某些构造在没有大括号的情况下会模棱两可:
foreach (@l) do_something unless $condition;
Run Code Online (Sandbox Code Playgroud)
是unless $condition
适用于整个事情还是只适用于do_something
声明?
当然这可以用优先级规则或其他东西来解决,但它可能是创建令人困惑的Perl代码的另一种方式:-)
ara*_*nid 11
无括号if-else子句的一个问题是它们会导致语法模糊:
if (foo)
if (bar)
mumble;
else
tumble;
Run Code Online (Sandbox Code Playgroud)
鉴于上述情况,在什么条件下执行?它可以被解释为发生时!foo
或foo && !bar
.添加大括号可以消除歧义,而不会过多地污染源.然后你可以继续说,拥有大括号总是一个好主意,所以让我们让语言需要它并解决无论是否应该使用它的无休止的C争吵.或者,当然,您可以通过完全去掉大括号并使用缩进来指示嵌套来解决问题.两者都是使清晰,明确的代码成为自然事物而不需要特别努力的方法.
在Programming Perl(Larry Wall共同撰写),第3版,第113页中,复合语句是根据表达式和块来定义的,而不是语句,而块有大括号.
请注意,与C和Java不同,[复合语句]是根据BLOCKS而不是语句定义的.这意味着需要括号 - 不允许悬挂声明.
我不知道这是否能回答你的问题,但似乎在这种情况下,他选择支持简单的语言结构而不是例外.
也许与您关于(可能)Perl 5及更早版本的问题没有直接关系,但......
在Perl 6中,控制结构不需要括号:
if $x { say '$x is true' }
for <foo bar baz> -> $s { say "[$s]" }
Run Code Online (Sandbox Code Playgroud)
如果括号也是可选的,那将是非常模糊的.
是不是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)