首页 > 解决方案 > 为什么 `my $x = if (0) {1} else {2}` 不起作用?

问题描述

在 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 BLOCK可以接受if条件?但是赋值不行吗?在上面看来,流控制必须要么

此外,鉴于上述简单事实,描述表现类似的 if 条件的正确方法是什么?它是一个有值的表达式吗?是不是评估后没有价值的流量控制结构?

最后,必须对 assignment 进行哪些修改才能使其接受if类似 a 的条件do BLOCK

标签: perlif-statementexpression

解决方案


解决问题的唯一答案和评论是金兹,

总体设计是 perl 具有仅在某些上下文中有意义的关键字,并且if是其中之一 - 它只能是语句的开头或语句修饰符,并且在=. 这首先是解析器的区别。除此之外,对“if语句返回什么”的考虑并不总是直观的,因此虽然您可以通过将其放在 do 块或子例程的最后一条语句中找到它,但不应该鼓励将其用作一个值。事实上,它通常会导致错误。– 格林茨 11 小时前

当 Ginnz 说解析器区别时,我将其解释为意味着为了清楚起见,这并不值得追求。在 an 之后有效的=内容根本不是if陈述,也没有真正的理由,只是它就是这样。

  • if条件是一个语句。
  • 语句的返回值。
  • 赋值=明确禁止右边的语句,因为它只接受表达式类中的东西。
  • ado BLOCK可以将语句转换为表达式。

推荐阅读