DOループの「最後」に代わるもの
-
09-10-2019 - |
質問
forのPerlマニュアルによると last
(http://perldoc.perl.org/functions/last.html), last
脱出するために使用することはできません do {}
ループですが、代替案は言及されていません。私が維持しているスクリプトには、この構造があります。
do {
...
if (...)
{
...
last;
}
} while (...);
そして、私は彼がループの終わりに行きたいと思っていると確信していますが、実際に現在のサブルーチンを出ているので、私はどちらかを変更する必要があります last
または、誰かが推奨できるより良い方法がある場合は、ループ全体を参照してください。
解決
do BLOCK while (EXPR)
面白いのは、実際にはループ構造ではないということです。したがって、最後、次、そしてやり直しはそこで使用されることは想定されていません。最後を取り除き、EXPRを調整して、その状況が見つかったときにfalseを評価します。また、厳格な電源を入れてください。これにより、少なくともここで警告が表示されます。
他のヒント
むき出しのブロックに「ループ」を包みます(これは は ループ):
{
do {
...
if (...)
{
...
last;
}
} while (...);
}
これはLASTとやり直しのために機能しますが、次はそうではありません。その場所のために、doブロック内の裸のブロック:
do {{
...
if (...)
{
...
next;
}
...
}} while (...);
Do/while loops in perlのファンではありません。 do
本当にループではありません last
それから抜けません。私たちの古いで Pascal
あなたは真ん中でループを出ることができなかったのでうこつき それは間違っているでしょう セージのニクラウスによると、「1つの入り口/1つの出口」ワース。したがって、出口フラグを作成する必要がありました。 Perlでは、次のようになります。
my $endFlag = 0;
do {
...
if (...)
{
...
$endFlag = 1;
}
} while ((...) and (not $endFlag));
今、あなたはパスカルが決して捕まえられなかった間に見ることができます。
我だけのループを使用してみませんか?
while (...) {
...
if (...) {
last;
}
}
テストがループの終わりではなく最初にあるという事実に対応するために、ロジックをわずかに変更する必要があるかもしれませんが、それは些細なことです。
ちなみに、Delphiを使用している場合、実際にPascalループから抜け出すことができ、DelphiはMicrosoftが目覚めて.NET言語を発表するまでしばらく追いつきました。
@ "http://perldoc.perl.org/functions/last.html":最後に使用して、eval {}、sub {}、do {}などの値を返すブロックを終了することはできず、grep()またはmap()操作を終了するために使用しないでください。
したがって、「while()」でブール値を使用して、「最後の」を持っているところに設定してください。
パーティーに遅れて - 私はいじりました for(;;)
近々。条件付き表現のための私の初歩的なテストで A
と B
, 、あなたがやりたいこと:
do {
last if A;
} while(B);
として達成することができます:
for(;; B || last) {
last if A;
}
少し醜いですが、おそらく他の回避策よりもそうではありません:)。例:
my $i=1;
for(;; $i<=3 || last) {
print "$i ";
++$i;
}
出力 1 2 3
. 。必要に応じて増分を組み合わせることができます。
my $i=1;
for(;; ++$i, $i<=3 || last) {
print "$i ";
}
(使用 ||
それはより高い優先順位を持っているからです ,
)