• ベストアンサー

Perlですが、redoの処理がいまいちわかりません

# 0から6未満の間で変数$aを1つずつ上げていく for ($a=0;$a<6;$a++){ # もし変数$aが3になればredo文を実行してブロック内の頭に飛べ。 if($a==3){ # 変数$aを表示して改行せよ。 print "$a a \n"; # 変数$aに100を代入せよ。 $a=100; redo; } # 変数$aを表示して改行せよ。 print "$a\n"; } と書いてみたのですが、実行結果が 0 1 2 3 a 100 となりました。 if($a==3)まで戻っていないように思います。redoのブロックが終わりぬけて100が表示されているのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

forの1回目、$a=0、$a<6が真なのでforの中に入る。1回目なので$a++は実行されない {# forの開始カッコ if($a==3){ # $a=0 のためif文の中に入らない } print "$a\n"; "0\n"を出力 } # for()の閉じカッコ forの2回目、$a++を実行($a=1となる)、$a<6は真なのでforの中に入る {# forの開始カッコ if($a==3){ # $a=0 のためif文の中に入らない } print "$a\n"; "1\n"を出力 } # for()の閉じカッコ forの3回目、$a++を実行($a=2となる)、$a<6は真なのでforの中に入る {# forの開始カッコ if($a==3){ # $a=0 のためif文の中に入らない } print "$a\n"; "2\n"を出力 } # for()の閉じカッコ forの4回目、$a++を実行($a=3となる)、$a<6は真なのでforの中に入る {# forの開始カッコ if($a==3){ # $a=3 のためif文の中に入る print "$a a\n"; # "3 a\n"を出力 $a=100; # $a=100に変わる redo # forまで戻るが、for($a=0;$a<6;$a++)の判定は行わない。 } # ifの閉じカッコ、redoで戻っているため実質的に無視される print "$a\n"; # redoで戻っているため、実行されない } # forの閉じカッコ、redoで戻っているため実質的に無視される # forの5回目、redoにより$a<6は判定されない。$a++は実行されない。($a=100のまま) if($a==3) # $a=100 のためif文に入らない } print "$a\n"; # "100\n"を出力 } # for()の閉じカッコ forの6回目、$a++を実行($a=101となる)、$a<6は偽なのでforの中に入らない { }# for()の閉じカッコ # forを抜けて終了 redo直前の$a=100;をコメントアウトすると、無限ループになります。 ここまで書く必要があるのだろうか、、と思いつつ、書いちゃったんでそのまま投稿。

その他の回答 (3)

  • W_H
  • ベストアンサー率47% (21/44)
回答No.3

確かredoはループの制御ですから、ifまでではなく、forのすぐ後まで戻るはずです。 そう考えれば、次のif判定では3でないので、forの判定文まで戻り、$aが6以上なので、終了しているものだと思われます。 for ($a=0;$a<6;$a++){ print "Start\n"; if($a==3){ print "$a a \n"; $a=100; redo; } print "$a\n"; print "end\n\n"; } この[print "Start\n";]と[print "end\n";]を入れた改造サンプルを実行してみてください。forのすぐ後まで戻ればStartという文字列を表示し、ループの最後まで実行すれば、Endという文字列を表示します。 実行結果は3 aの後ろにはEndではなくStartと表示され、100の後にEndが表示されます。 つまり、ちゃんとredoで戻っていることが確認できるはずです。(ちなみに、ループが終わるごとに空行を入れているので、一回の動作が分かりやすいと思います。)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

if($a==3)まで戻っていると思いますよ? ただ、そのときは$aが100なためにif文ブロック内は実行されないので、 出力はredoがあってもなくても同じですが。 それとも、redoでifブロックがやり直されると思ってますか? last,next,redoはループ制御文なので、 redoはループブロックの始めから再実行ですよ。 (ifブロックがやり直されてしまうとループ制御できませんからね。) > ANo.1 > $a<6ではないですから、ループの中は実行されず、次の行に移ってます redoはループ条件を再評価しないので、redo後少なくとも1回は実行されるはず。

回答No.1

そうです。 $a = 100 ですから $a<6ではないですから、ループの中は実行されず、次の行に移ってます

関連するQ&A

専門家に質問してみよう