Perl 为什么';t`my$x=如果(0){1}还有{2}`工作?

Perl 为什么';t`my$x=如果(0){1}还有{2}`工作?,perl,if-statement,expression,Perl,If Statement,Expression,在perl中,$x=if(0){1}else{2}不起作用 $ perl -E'$x = if (0) {1} else {2}' syntax error at -e line 1, near "= if" Execution of -e aborted due to compilation errors. 这是有意义的,因为if条件在Perl中不是表达式。它们是流量控制 但是 my $x = do { if (0) {1} else {2} }; 真管用!为什么do块可以接受if条件?但

在perl中,
$x=if(0){1}else{2}
不起作用

$ perl -E'$x = if (0) {1} else {2}'
syntax error at -e line 1, near "= if"
Execution of -e aborted due to compilation errors.
这是有意义的,因为
if
条件在Perl中不是表达式。它们是流量控制

但是

my $x = do { if (0) {1} else {2} };
真管用!为什么
do块
可以接受
if
条件?但任务不能吗?在上面的例子中,似乎流量控制必须

  • 知道它在
    do块中的上下文
  • 始终充当表达式,但语法分析器不允许使用该语法
此外,考虑到上面的简单事实,什么是正确的方式来描述这样行为的if条件?它是一个带值的表达式吗?评估后没有价值的是流量控制结构吗


最后,必须对赋值进行哪些修改,以使其接受
if
条件,如
do BLOCK
在一个问题中,唯一解决问题的答案和注释是Ginnz


总体设计是,perl的关键字只有在某些上下文中才有意义,如果
是其中之一,则
只能是语句的开头或语句修饰符,并且它们都不能直接在
=
之后有效这首先是解析器的区别。除此之外,考虑“如果
语句返回什么内容”并不总是直观的,因此,尽管您可以通过将其放入do块或子例程的最后一条语句中来发现,但不应鼓励将其用作值。事实上是这样的格林斯11小时前


当Ginnz说parser Differention时,我认为这意味着,作为一个明确的问题,这不太值得一提。在
=
之后有效的不是
if
语句,也没有真正的原因,除了它是怎样的

  • 如果
    是条件语句
  • 语句的返回值
  • 赋值
    =
    明确禁止右边的语句,因为它只接受表达式类中的内容
  • do块
    可以将语句转换为表达式

DO块内的代码行为不同。Perl解释花括号内的代码,并输出最后一个命令的结果


    #!/usr/bin/perl
    
    use Data::Dumper;
    
    my $x = do { { 1==1 } };
    my $y = do { { 1==0 } };
    print Dumper 1==0;
    print Dumper $x;
    print Dumper $y;

阅读更多关于您要做的事情:

这是不允许的语法。每个语句都有上下文,do块提供上下文,就像语句是子例程中的最后一个一样。我看不出允许
$x=if…
飞行有什么好处。如果你想在表达式中使用任意语句,那么确实存在这样的块。最重要的设计是perl的关键字只有在某些上下文中才有意义,如果
是其中之一,那么
只能是语句的开头或语句修饰符,并且在
=
之后,这两个关键字都不直接有效。这首先是解析器的区别。除此之外,考虑“if语句返回的内容”并不总是直观的,因此,尽管您可以通过将其放入do块或子例程的最后一条语句中来发现,但不应鼓励将其用作值。事实上是这样的。@grinz如果你想回答这个问题,我接受。perl语法与许多语言一样,区分表达式和语句。虽然不同的语言之间有不同的界线;例如,赋值是某些语言中的语句。但作为一个完全独立的问题,在perl中,语句确实有返回值(不管是否有文档记录);例如,块“语句”返回其最后一条语句的值;不输入块的if或除非返回测试表达式的值,而输入块的if或除非返回块的值;a for不返回任何内容。“当Ginnz说parser Differention时,我认为这意味着,作为一个明确的问题,这不太值得一提。”我可以说,你还没有用这句话清楚地表达自己Aiui您误解了“解析器区别”是特定于
if
的,但Grinnz不是这个意思。“在
=
语句之后有效的内容根本不是
if
语句”根本不是任何语句。“没有真正的原因”我想如果
=
拒绝右边的语句,大多数人至少会感到困惑(因为如果允许的话,许多语句会做一些完全令人困惑的事情)。“如果允许的话,许多语句会做一些完全令人困惑的事情”-对,比如:
my$foo=foreach(@things){say}
-你可以用一个
do{}
当然可以,但是为什么?