4

为什么 Perl 有 'elsif' 而没有 'elseif'?

我正在做这样的事情:

$somevariable = 0;
if ($idcount==5) 
{
    # Do something
    if (somestatement is true) # 1 
    {
        $somevariable = 1;
    }
}
elsif ($idcount > 1 && somevariable = 0)
{
    # Do something else here
}

代码永远不会出现在 elsif 语句中。在这种情况下idcount实际上是 5,所以它涉及到第一个 if 语句。但是内部if陈述(1)不正确,所以$somevariable仍然是 0。既然idcount是 5,它也应该成立,elsif因为$idcount它大于 1 并且$somevariable仍然是 0。

也许我只是累了,没有看到明显的东西。

4

9 回答 9

12

不,elsif只有在前面的 if/elsif 条件都不为真的情况下,任何东西才有机会被执行,这就是它的“else”部分。

如果您希望两者都被评估,只需将其设为 anif而不是elsif.

于 2009-03-18T18:32:55.740 回答
11
elsif ($idcount > 1 && somevariable = 0)

应该:

elsif ($idcount > 1 && $somevariable == 0)

赋值运算符返回分配的值 0,等于 false,因此逻辑和 '&&' 总是失败。

于 2009-03-18T18:55:08.823 回答
10

以下是Llama 书如何回答 elsif 与 elseif 的问题:

“因为拉里是这么说的。”

于 2009-03-18T19:15:30.957 回答
7

在任何 if-elsif-else 构造中,您只执行条件为真的第一个分支。一旦该分支执行,程序会在整个 if-elsif-else 之后继续执行。

如果你想用可能的多个分支来做某事,你可以用多个if块构建你自己的 case-like 语法。Perl 5.10有一个given-when构造,但它已退回到实验状态,可能会从语言中删除。

至于 的拼写elsif,涉及到几个因素。

在 C 中,你写

if( ... ) {
   ... }
else if ( ... ) {

这有时会导致“悬空其他”问题。如果你已经开始但没有完成if-else if在另一个之前插入一个正确的但不同的if,你已经通过悬空的 else 将两者结合起来。拉里·沃尔不喜欢这样,所以他将“else if”组合成一个词,“elseif”。然而,这对拉里来说很奇怪,因为规则是“i 在 e 之前,除了 c 之后,......”,所以他通过取出“e”使其只是“elsif”来解决这个问题。

于 2009-03-19T02:21:37.173 回答
4

我看不出你的困惑与 perl 使用“elsif”而不是“else if”或“elseif”这一事实有什么关系。在我曾经使用过的每一种语言中,从 1970 年代之前的 FORTRAN 到 Java,以及一路走来的诸如 Easytreive 之类的“亮点”,如果你执行“if cond ... else ...” else 之后的东西不会如果原始“cond”为真,则不会被执行。这就是“其他”的意思。

在您的情况下,“cond”是“($idcount == 5)”,您已经说过这是真的,而因为它是真的而没有被执行的else部分是“if($idcount> 1 && $somevariable == 0) ..."。

于 2009-03-18T18:38:52.467 回答
3

Perl 有 elsif,因为 perl 不允许 C 风格的“else if”不带括号。相反,你需要有类似的东西:

if (x) {

}
else {
  if(y) {

  }
}
于 2009-03-19T03:32:52.620 回答
2

Perl 中的“elsif”与其他语言中的“elseif”、“else if”和“elif”完全相同。这只是拼写的问题。

于 2009-03-18T18:50:39.800 回答
1

这是问题中发布的内容的等价物。

use strict;
use warnings;

$somevariable = 0;
if ($idcount==5) 
{
  # do something
  if ( 1 )
  {
    $somevariable = 1;
  }
}
else
{
  if ($idcount > 1 && somevariable == 0) # this line was wrong in the question
  {
    # do something else here
  }
}

或者

use Modern::Perl;

$somevariable = 0;
given($idcount){
  when( 5 ){
    # do something
    if ( 1 ){
      $somevariable = 1;
    }
  }
  when( $_ > 1 && $somevariable == 0 ){
    # do something else here
  }
}

use Modern::Perl; 是相同的 use strict; use warnings; use 5.010;

于 2009-03-18T19:41:54.390 回答
0

如果你要使用if...elsif任何语言,你的条件应该是互斥的。您的示例中的两个条件可能同时为真,因此您应该将其分解为两个单独的if语句。

于 2009-03-18T18:51:20.250 回答