9

for の perl マニュアルlast( http://perldoc.perl.org/functions/last.html ) によると、ループlastから抜け出すために使用することはできdo {}ませんが、代替手段については言及されていません。私が維持しているスクリプトの構造は次のとおりです。

do {
    ...
    if (...) 
    {
        ...
        last;
    }
} while (...);

彼はループの最後に行きたいと思っていると確信していますが、実際には現在のサブルーチンを終了しているのでlast、誰かが推奨できるより良い方法がある場合は、ループ全体を変更するかリファクタリングする必要があります。

4

6 に答える 6

17

do "loop"をベアブロック(ループ)でラップします。

{
    do {
        ...
        if (...) 
        {
            ...
            last;
        }
    } while (...);
}

これは最後とやり直しで機能しますが、次では機能しません。そのために、doブロック内に裸のブロックを配置します。

do {{
    ...
    if (...) 
    {
        ...
        next;
    }
    ...
}} while (...);
于 2010-12-06T18:34:38.310 に答える
10

do BLOCK while (EXPR)面白いのは、実際にはループ構造ではないということです。したがって、last、next、およびredoはそこで使用されることは想定されていません。最後のものを取り除き、その状況が見つかったときにfalseを評価するようにEXPRを調整します。また、strictをオンにすると、少なくともここで警告が表示されます。

于 2010-12-06T18:22:56.773 に答える
2

Perl の do/while ループのファンではありません。これdoは実際にはループではlastないため、抜け出せません。賢者ニクラウスの「入り口は一つ、出口は一つ」ワースによれば、私たちの昔ながらのPascalぼんやりでは、途中でループを抜け出すことはできませんでしたしたがって、終了フラグを作成する必要がありました。Perl では、次のようになります。

my $endFlag = 0;
do {
    ...
    if (...) 
    {
        ...
        $endFlag = 1;
    }
} while ((...) and (not $endFlag));

これで、パスカルが流行らなかったことがわかります。

于 2010-12-06T19:03:23.113 に答える
2

whileループを使用しないのはなぜですか?

while (...) {
  ...
  if (...) {
    last;
  }
}

テストがループの最後ではなく最初にあるという事実に対応するために、ロジックを少し変更する必要があるかもしれませんが、それは簡単なはずです。

ところで、Delphi を使用している場合、実際に Pascal ループから抜け出すことができます。Delphi DID は、Microsoft が賢明になって .net 言語を発表するまでしばらくの間、追いつきました。

于 2013-01-04T19:35:14.793 に答える
1

@ "http://perldoc.perl.org/functions/last.html": last は、 eval {} 、 sub {} または do {} などの値を返すブロックを終了するために使用できず、使用すべきではありませんgrep() または map() 操作を終了します。

したがって、「while()」でブール値を使用し、「last」がある場所に設定します...

于 2010-12-06T18:17:31.510 に答える