4

なぜPerlには「elseif」ではなく「elsif」があるのですか?

私はこのようなことをしています:

$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) は true ではないため、$somevariableまだ 0です。is は 5 であるため、 is は 1 よりも大きく、まだ 0 であるため、同様idcountになるはずです。elsif$idcount$somevariable

多分私はただ疲れていて、明らかなものが見えていません。

4

9 に答える 9

12

いいえ、elsif以前の if/elsif 条件のいずれも真でなかった場合にのみ実行される可能性があります。それが「else」部分です。

両方を評価したい場合は、 のif代わりに にしelsifます。

于 2009-03-18T18:32:55.740 に答える
10

Llama bookが elsif と elseif の質問にどのように答えるかを次に示します。

「ラリーがそう言ってるから」

于 2009-03-18T19:15:30.957 に答える
7

if-elsif-else コンストラクトでは、条件が true である最初のブランチのみを実行します。その分岐が実行されると、プログラムは if-elsif-else 全体の後を取得します。

可能性のある複数の分岐で何かをしたい場合は、複数のifブロックを使用して独自の大文字と小文字のような構文を構築できます。Perl 5.10 からのコンストラクトがありますが、given-when実験的な状態に後退しており、言語から削除される可能性があります。

のスペルに関してelsifは、いくつかの要因が関係しています。

Cでは、次のように記述します

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

これにより、「ダングリング エルス」の問題が発生することがあります。if-else if別の右の前に挿入を開始したが、完了しなかったが、異なるif場合は、ぶら下がっているelseを介して2つを結合しています。Larry Wall はそれが気に入らなかったので、「else if」を「elseif」という 1 つの単語にまとめました。ただし、規則が「i の前は e の前で c の後を除いて ...」であるため、Larry には奇妙に見えたので、彼は「e」を削除して「elsif」にすることで修正しました。

于 2009-03-19T02:21:37.173 に答える
4

perl が "else if" や "elseif" ではなく "elsif" を使用しているという事実に、あなたの混乱がどう関係しているのかわかりません。1970 年代以前のスタイルの FORTRAN から Java まで、私がこれまでに使用したすべての言語で、途中で Easytreive などの「ハイライト」を含めます。元の「条件」が true の場合は実行されません。それが「その他」の意味です。

あなたの場合、「条件」は「($ idcount == 5)」であり、これはすでにtrueであり、trueであるため実行されないelse部分は「if($ idcount > 1 && $somevariable == 0) ...」.

于 2009-03-18T18:38:52.467 に答える
3

perl では C スタイルの "else if" をブラケットなしで使用できないため、Perl には elsif があります。代わりに、次のようなものが必要です。

if (x) {

}
else {
  if(y) {

  }
}
于 2009-03-19T03:32:52.620 に答える
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 に答える