28

ifこれがちょうど出てきました:ステートメントから抜け出すにはどうすればよいですか?長い if 文がありますが、早い段階で抜け出せる状況が 1 つあります。

ループでこれを行うことができます:

while (something ) {
    last if $some_condition;
    blah, blah, blah
    ...
}

しかし、if文で同じことができますか?

if ( some_condition ) {
    blah, blah, blah
    last if $some_other_condition; # No need to continue...
    blah, blah, blah
    ...
}

ブロック内にステートメントを配置できることはわかってifいます。その後、ブロックから抜け出すことができます。

{
    if ( some_condition ) {
        ...
        last if $some_other_condition; # No need to continue...
        blah, blah, blah
        ...
    }
}

または、サブルーチンを作成することもできます (これはおそらくプログラム的に優れています)。

if ( some_condition ) {
    run_subroutine();
}

sub run_subroutine {
    blah, blah, blah
    return if $some_other_condition;
    blah, blah, blah
    ...
}

しかし、if状態を終了する方法はありますか?


解像度

私が誰かのコードを手伝っていたので、質問が出てきました。かなり長いifステートメントの中に、他のいくつかのifステートメントが埋め込まれていました。コードは次のようになります。

 if ( $condition1 ) {
    blah, blah, blah;
    if ( not $condition2 ) {
       blah, blah, blah;
       if ( not $condition3 ) {
          blah, blah, blah;
       }
    }
}

これを行うことで、全体が読みやすくなると思いました:

if ( $condition1 ) {
    last if $condition2;
    blah, blah, blah;
    last if $condition3;
    blah, blah, blah;
}

これは、ステートメントの通常の流れifが標準的であることを示していますが、特定の条件下では、ifステートメントが早期に終了したことを示しています。これは、orループでlastorを使用してループを終了するのと同じです。nextwhilefor

ラベル自体を使用しなくても、ラベルを使用するmpapec のソリューションが気に入りました。ラベルは my の説明ですif:

IF-UNDER-CONDITION1:
{
    if ( $condition1 ) {
        last if $condition2;
        blah, blah, blah;
        last if $condition3;
        blah, blah, blah;
    }
}

これは標準的なコーディング手法ではありませんが、コードの流れは明らかなので、典型的な低レベルの Perl 開発者 (私が離れた後にこのコードを保守する必要がある開発者) は、コードが何を行っているかを理解し、保守することができます。 . その過程で何かを学ぶことさえあるかもしれません。

4

7 に答える 7

30

、 、の対象となる基本ブロックを使用できますので、ブレイクする可能性があります。lastnextredo

if ($condition) {EXIT_IF:{

   last EXIT_IF; # break from code block

   print "never get's executed\n";
}}

EXIT_IF: {
  if ($condition) {

     last EXIT_IF; # break from code block

     print "never get's executed\n";
  }
}
于 2013-06-11T21:01:27.597 に答える
3
  • 空のfor()ループの中に入れて、last;分割したいすべての場所に AND の後に追加しますif。少し醜いですが、動作します。トリックを説明するコメントを必ず追加してください。

    for (;;) {
        if (condition) { 
            #code
            last if another_condition;
        }
        last;
    }
    
  • gotoそのgotoのループの後にステートメントを使用してラベルを付けます。永遠にのろわれてください。

  • if(eg )内の余分なブロックif () {{ code }}。初心者には読みにくいかもしれませんが、コメントを添えればOKです。

  • あなた自身の解決策:周囲をブロックしてくださいif。読みやすさに関してはあまり明白ではありません。

  • あなた自身の解決策:戻りのあるサブルーチン。

    率直に言って、サブを呼び出すコストが賢くパフォーマンスに影響しない限り、これは読みやすさに関する限り最もクリーンなソリューションです。

于 2013-06-11T20:58:55.087 に答える
2

次のように、残りのifブロックを別のifステートメント内に配置できます。

if (some_condition) {
    blah, blah, blah
    if (!$some_other_condition) {
        blah, blah, blah
        ...
    }
}
于 2013-06-11T20:58:56.580 に答える
0

もう 1 つの方法は、無名サブルーチンを使用することです。
注:スコープが複雑になるため、この方法はお勧めしません (以下の注を参照)。考えられる答えを完全にするためだけです。

if( $true_condition ){
   (sub{
       return if $true_condition;
       ...
   })->();
}

注:ルーチン内で宣言された変数は、コードの残りの部分で使用する場合はour代わりに使用する必要があります。my

于 2013-06-11T21:02:43.447 に答える
0

while使用できるようにループを保持しますlast 、ループが最大で 1 回実行されるようにしてください。

my $loop_once = 1;
while ( $loop_once-- and some_condition ) {
    blah, blah, blah
    last if $some_other_condition; # No need to continue...
    blah, blah, blah
    ...
}
于 2014-12-01T17:34:20.337 に答える