制御構文 do{ } とは?

[上に] [前に] [次に]
Visual Perl 2000/03/10(金) 02:38:26
http://www.tohoho-web.com/wwwperl1.htm#do
にdo{...}を用いて、if(...), unless(...), while(...), until(...)の構文順序を変更することができます。
とあるんですが。順序変更できると何か利点があるのでしょうか?

変な質問かもしれませんが、良くわからないので教えてください。

Ichi 2000/03/10(金) 05:12:40
while/until(expr) {
(1)
}
とすると、exprを評価し、真であれば、(1)を実行するということを繰り返します。
つまり、最初からexprが偽であれば、(1)は一回も実行されません。

do {
(2)
}while/until(expr);
とすると、まず(2)が実行され、その後に、
exprを評価し、真であれば(2)を実行するということを繰り返します。
つまり、(2)はexprが最初から偽であっても最低「一回は」実行されます。

# これが便利

Visual Perl 2000/03/10(金) 05:17:45
if(){} unless(){}の場合はどう便利なんでしょうか?

$xx = 4;
do { print "xx = $xx\n"; } if ($xx == 5);

この場合何もプリントされないのですが。

Ichi 2000/03/10(金) 05:39:58
すいません、良くわかりません(おい
が、この場合、まさに単に書く順番が変わるだけだと思います。

maybe 2000/03/10(金) 14:27:41
基本的に、
if(),unless()は、非ループ系の制御文で、
while(),until()は、ループ系の制御文です。

後者の括弧内はループ終了条件としての評価式であり、
その条件を満たす間、評価を繰り返します。

前者は括弧内は単純な一回限りの評価式です。
この一文だけでは確かに、記述順序の入れ替えに
過ぎないですが、たとえば、
この一文をその評価式の値が変化するループの中に置けば、
それなりに有用です。

if(false)sorry;

maybe 2000/03/10(金) 15:33:44
前言撤回(冷や汗)。

if(),unless()は、非ループ系の制御文で、
while(),until()は、ループ系の制御文です。
ここまではいいのですが、

この前提でよくよく考えてみると、

do{}の本来の存在意義は、
「ループ系の制御文」(強調)において、
最初の1回目は必ず実行する
というもの。

結局、非ループ系の
if(),unless()に関しては元の構文と差が無いことになる
と考え直しました。

do{}の存在意義は、ループ構造における、
ループ終了条件としての評価式の評価のタイミングに
関連しているのであって、
ループ構造を内包しないif(),unless()では、
何ら構造上の意味はないと考えましたがいかがでしょうか?

if(false)sorry;

maybe 2000/03/10(金) 15:37:58
前言撤回(冷や汗)。

if(),unless()は、非ループ系の制御文で、
while(),until()は、ループ系の制御文です。
ここまではいいのですが、

この前提でよくよく考えてみると、

do{}の本来の存在意義は、
「ループ系の制御文」(強調)において、
最初の1回目は必ず実行する
というもの。

結局、非ループ系の
if(),unless()に関しては元の構文と差が無いことになる
と考え直しました。

do{}の存在意義は、ループ構造における、
ループ終了条件としての評価式の評価のタイミングに
関連しているのであって、
ループ構造を内包しないif(),unless()では、
何ら構造上の意味はないと考えましたがいかがでしょうか?

if(false)sorry;

無責任官庁 2000/03/10(金) 15:41:52
直接動作には関係無い話ですけども、

&Congratulations if($result == 1);

という表記の方が、英文らしくてわかりやすいって人もいますね。

Visual Perl 2000/03/10(金) 20:36:06
ループ系do構文は良く使うので納得なのですが、doif dounlessは特に制御構文として特別な用途のあるものでは無いと理解するべきなんでしょうか?

なんかすっきりしないですが、Perlはいろんな記述ができるという例の奴で解決とします。
回答してくださった方々,ありがとうございました。

Visual Perl 2000/03/10(金) 20:36:36
[[解決]]
忘れてた。

izzard 2000/03/11(土) 00:07:50
while (EXPR) { STATEMENT }

STATEMENT while (EXPR);
は表現が違うだけで、意味は同じ。

do { STATEMENT } while (EXPR);
にすると、{}内を一度実行してからwhile修飾子を評価。

と言うことで、
http://www.tohoho-web.com/wwwperl1.htm#do
の「do { ; }を省略することができます。」は正確ではないような(^^;

mm 2000/03/11(土) 00:33:15
# izzardさんとかぶっちゃったけど…(^^;

後置のif unless while until は、修飾子というもので、
単純文(複合文ではない普通の文)の後ろに1つだけ置くことができるものです。

また、do BLOCK if EXPR や do BLOCK while EXPR などという構文がある訳ではなく、
do BLOCK も単純文だから、他の単純文と同様に、
その後に、if修飾子や while修飾子などが置けるにすぎません。

このヘン、詳細は、青ラクダ本(プログラミングPerl)の「2.6.1 単純文」を参照して下さい。

ただし、do BLOCK while EXPR と do BLOCK until EXPR だけは、
EXPR にかかわらず、最初に do BLOCK 内を必ず1回評価するという特別扱いがされます。
これは、C の do while 文や Pascal の repeat until 文に倣うためのもので、
論理性よりも実用を優先した実装を採用した為だと思っています。

そういう意味では、
http://www.tohoho-web.com/wwwperl1.htm#do
の解説は、一考の余地がありそうです。
$xx = 10; とした場合、
do { print "xx = $xx\n"; $xx++; } while ($xx < 5);
では、1回表示が行われますが、
print "xx = $xx\n" while ($xx++ < 5);
では、表示は全く行われないという違いが読み取れないからです。

[上に] [前に] [次に]