elsif如何在Perl中工作?

时间:2009-03-18 18:30:49

标签: perl conditional

为什么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.

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

9 个答案:

答案 0 :(得分:12)

不,elsif中的任何内容只有在之前的if / elsif条件都没有的情况下才有可能被执行,这就是它的“其他”部分。

如果您希望对它们进行评估,只需将其设为if而不是elsif

答案 1 :(得分:11)

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

应该是:

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

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

答案 2 :(得分:11)

以下是the Llama book如何回答elsif vs elseif问题:

  

“因为拉里这么说。”

答案 3 :(得分:7)

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

如果要对可能的多个分支执行某些操作,可以使用多个if块构建自己的类似于case的语法。 Perl 5.10中有一个given-when构造,但它已经退回到实验状态,可以从语言中删除。

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

在C中,你写了

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

这有时会导致“悬空”的问题。如果你已经开始但没有完成在另一个if-else if之前插入if但是截然不同的{{1}},那么你通过悬空的其他方式将两者结合起来。 Larry Wall并不喜欢这样,所以他将'else if'合并成一个单词,“elseif”。然而,对于Larry看起来很奇怪,因为规则是“我在e之前除了c之后......”,所以他通过取出“e”来确定它只是“elsif”。

答案 4 :(得分:4)

我不知道你的混淆与perl使用“elsif”而不是“else if”或“elseif”的事实有什么关系。在我曾经使用的每种语言中,从20世纪70年代以前的FORTRAN到Java,以及像Easytreive这样的“亮点”,如果你做“如果cond ...... else ......”之后的其他语言如果原始“cond”为真,则执行。这就是“其他”的含义。

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

答案 5 :(得分:3)

Perl有elsif,因为perl不允许C风格“否则如果”没有括号。相反,你需要有类似的东西:

if (x) {

}
else {
  if(y) {

  }
}

答案 6 :(得分:2)

Perl中的“elsif”与“elseif”,“else if”和“elif”在其他语言中的工作方式完全相同。这只是一个拼写问题。

答案 7 :(得分: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;

答案 8 :(得分:0)

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