为什么必须';如果';Perl中的子句要么带花括号,要么什么都不带?

为什么必须';如果';Perl中的子句要么带花括号,要么什么都不带?,perl,if-statement,syntax,Perl,If Statement,Syntax,这没关系: if ($some_var==$some_value) {} 这也可以: print "hello" if ($some_var==$some_value); 但这带来了一个错误: if ($some_var==$some_value) print "some_message"; 为什么Perl中的“if”子句必须带花括号或不带任何内容?我认为它根本不受支持,但这是:打印“some_message”if($some_var==$some_value)这就是perl语法的定义方式

这没关系:

if ($some_var==$some_value) {}
这也可以:

print "hello" if ($some_var==$some_value);
但这带来了一个错误:

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

为什么Perl中的“if”子句必须带花括号或不带任何内容?

我认为它根本不受支持,但这是:
打印“some_message”if($some_var==$some_value)

这就是
perl
语法的定义方式。
if(expr)块
语法需要块,而不是语句。参见(“复合语句”部分)

摘录:

if语句很简单。因为块总是以花括号为边界,所以如果使用else,则不会有任何歧义

if($some\u var==$some\u value)在我尝试它时不是“ok too”(我也没料到会是)


为什么需要块,而不允许普通表达式?因为这正是Larry想要的。

Perl的语法相当复杂,很难解析。我推测,在if子句后面必须加上花括号,以消除歧义并使Perl代码更易于解析。

以避免编译器构造中众所周知的问题,即“悬空的else”。请看

我不知道卷发的情况,但拉里·斯伯德提到,帕伦斯可能是可选的。我相信他决定不这样做是为了保持代码的可读性。

如果前面有一条语句,那就“ok”
if($foo)打印“hello!”
.oops,对不起,这个“if(子句);”不是okoh是的,但是[print“hello”if(1==1);“是的]@nicola:你把语句修饰符和控制流结构混合在一起,完全没有抓住要点。歧义消除,是的,但不容易解析;解析器(以前的yacc,现在的bison)可以简单地更改为不需要{}。好吧,Larry一直在谈论他是如何重构语法以减少产品数量以处理Perl语法的。这就是我所说的易于解析的意思:产品的设计。之所以这样做是因为恼人的C错误,大括号是可选的。将其设为非可选解决了这个错误。我已经编程20多年了。在这段时间里,我犯了很多很多很多的编码错误。把if语句的else搞乱了,或者忘记了依赖块的括号,这肯定是我犯过的最罕见的错误之一。人们真的很难做到这一点吗???!你很困惑。它不可能什么都没有。括号是必须的。而且有很好的理由。如果你你想要一个不带块的
if
语句,为什么不像
$some\u var==$some\u value那样使用
,并打印“some message”;
类似于
if
的语句修饰符形式,但参数是相反的。