elsif如何在Perl中工作?

问题描述 投票:4回答:9

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

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

perl conditional
9个回答
12
投票

不,如果以前的if / elsif条件都没有,那么elsif中的任何东西都只有机会被执行,那就是它的“其他”部分。

如果你想要两者都进行评估,只需将它设为if而不是elsif


11
投票

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

“因为拉里这么说。”


11
投票
elsif ($idcount > 1 && somevariable = 0)

应该:

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

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


7
投票

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

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

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

在C中,你写

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

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


4
投票

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

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


3
投票

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

if (x) {

}
else {
  if(y) {

  }
}

2
投票

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


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
  }
}

or

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;相同


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.