Как работает elsif в Perl? - PullRequest
4 голосов
/ 18 марта 2009

Почему в 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 ]

12 голосов
/ 18 марта 2009

Нет, все в elsif может быть выполнено только в том случае, если ни одно из предыдущих условий if / elsif не было выполнено, это часть "else".

Если вы хотите, чтобы оба были оценены, просто сделайте его if вместо elsif.

11 голосов
/ 18 марта 2009

Вот как Книга лам отвечает на вопрос elsif vs elseif:

«Потому что Ларри так говорит».

11 голосов
/ 18 марта 2009
elsif ($idcount > 1 && somevariable = 0)

Должно быть:

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

Оператор присваивания возвращает присвоенное значение 0, что соответствует ложному значению, поэтому логическое значение и & && всегда завершается неудачей.

7 голосов
/ 19 марта 2009

В любой конструкции if-elsif-else вы всегда выполняете только первую ветвь, условие которой истинно. Как только эта ветвь выполняется, программа запускается после всего if-elsif-else.

Если вы хотите что-то сделать с несколькими возможными ветвями, вы можете создать свой собственный синтаксис, подобный регистру, с несколькими блоками if. В Perl 5.10 существует конструкция given-when, но она ретроградно перешла в экспериментальный статус и может быть удалена из языка.

Что касается написания elsif, то здесь есть несколько факторов.

В C вы пишете

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

Это иногда вызывает проблему "висящего другого". Если вы начали, но не закончили вставку if-else if прямо перед другим, но отличным, if, вы объединили их через висячее другое. Ларри Уоллу это не понравилось, поэтому он объединил «else if» в одно слово «elseif». Однако Ларри это показалось странным, поскольку правило «я до е, кроме с, ...» исправил это, убрав «е», чтобы сделать его просто «эльсиф».

4 голосов
/ 18 марта 2009

Я не понимаю, какое ваше замешательство связано с тем, что perl использует «elsif», а не «else if» или «elseif». На каждом языке, который я когда-либо использовал, начиная с FORTRAN в стиле до 1970-х годов и заканчивая Java и, в том числе, такими «основными моментами», как Easytreive, если вы делаете «if cond ... else ...», то, что не указано в else не выполняется, если исходный "cond" является истинным. Вот что значит «еще».

В вашем случае «cond» - это «($ idcount == 5)», которое вы уже указали как «истина», а остальная часть, которая не выполняется, потому что это «истина», - if ($ idcount> 1 && $ somevariable == 0) ... ".

3 голосов
/ 19 марта 2009

В Perl есть elsif, потому что perl не допускает стиль C "else if" без скобок. Вместо этого вам нужно иметь что-то вроде:

if (x) {

}
else {
  if(y) {

  }
}
2 голосов
/ 18 марта 2009

«elsif» в Perl работает точно так же, как «elseif», «else if» и «elif» в других языках. Это просто вопрос правописания.

1 голос
/ 18 марта 2009

Вот эквивалент того, что было опубликовано в вопросе.

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;

0 голосов
/ 18 марта 2009

Если вы собираетесь использовать if...elsif на любом языке, ваши условия должны быть взаимоисключающими. Оба условия в вашем примере могут быть истинными одновременно, поэтому вы должны разбить это на два отдельных оператора if.

...