Perl Perl_0
Perl 「 ループ処理 」(while その 2 "無限ループ") (0x0f)

Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x0f 回。
Perl で while 制御構造を使った無限ループについて。
無限ループ
while ループ文で、インクリメントまたはデクリメント (に限らず、意図してループを抜ける処理) がない場合にいったんループがはじまると、Perl 側では、自発的にループを止めるすべがありません。
$num = 0;
while ( $num <= 9 ) {
print "\$num の値は $num です。\n";
}
上記のプログラムを実行すると、Perl は延々と「$num の値は 0 です。」を繰り返し表示します。while の条件式がずっと 真 のままだからです。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
:
.
この様な状態を「無限ループ ( Infinite loop)」と呼びます。
Ctrl (コントロール) + c (シー)
意図しない無限ループは、意図した処理ではないので、その出会いは突然訪れます。僕が初めてこの現象に遭遇した時は、走り続けるプログラムを目の当たりにして、固まってしまいました。
「あ…ありのまま 今 起こっている事を話すぜ!」
と言っている間も、プログラムは無機質なメッセージを繰り返し表示し続けます。すると、近くにいた友人が 「Ctrl + c 」と呟きました。
そうです、仮にあなたのプログラムが、同様の状態に陥ったなら、冷静にキーボードを見据えて、Ctrl + c を押してください。
Ctrl + c は、利用しているシステムが提供する、プログラムを強制的に停止する機能です。恐怖に駆られてシステムの電源を落とす必要はありません。
システムによっては別のキーを押す場合がありますが、ほとんどのシステムでは Ctrl + c で間に合うでしょう。そうでなければ、該当のシステムのドキュメントを読む必要があります。
プログラム上の意図しない無限ループの発生は、初心者の単純なミスによって発生しやすいものですが、プログラミングの上級者であっても、特に精密な数値解析を行う場合は、意図しない無限ループにハマり込むことがあるそうです。
また、身近なところでは、電子メールの転送設定で、転送先と転送元がお互いに転送しあうという様なループがあります。これも一種の無限ループにあたります。
単純ですが、なかなか深刻なケースなので、多角的なメール転送を行う場合は特に注意しましょう。
意図した 無限ループ
無限ループは、一見すると、ミスから誘発されるプログラムの暴走の様に見えますが、わりと多くのプログラム (たぶん、特に組み込み系) で、入力の待ち受けをする時に使われています。
通常無限ループは、意図しない場合に用いる言葉なので、意図する無限ループという用法は、おかしな用法です。
意図する無限ループは、何かしらループを抜ける条件を用意しますが、条件が満たされない限り、ループは延々と (システムから強制的に終了されるか、電源が落ちるまで) 回り続けます。
ほとんどの場合は、(ユーザの操作等) プログラムの外部からの入力を待ち受けます。
例えば以下の様にすると、要求された 5 以下の数値が入力されない限り、while 文はループを繰り返し続けます。
print "5 以下の 数値を入力して Enter キーを押してください:\n";
while ( 1 ) {
chomp ( my $num = <STDIN> );
if ($num <=5) {
print "入力された値は $num です。\n";
last;
}
}
3 行目の while の条件式には数値の「1」が入っています。
Perl では、数値の「0」および「(空文字)」、それと「undef」は 偽、これ以外の値はすべて 真 と判定するため、この while 文の条件式は、常に 真 と判定されます。
このため、while の条件式では、このループを止めることが出来ません。
代わりに、9 行目の if 文の処理の中に書かれた last という演算子が、ループを抜け出す処理を請け負います。
7 行目にある if 文の条件式が 真 と判定された場合、プログラムの処理は last に渡されて while ループを抜け出します。
上記の例では、ユーザが 5 以下の数値を入力して Enter キーを押すまで、while ループは回り続けます。
5 以下の 数値を入力して Enter キーを押してください: # 1 行目の print でユーザに入力を促すコメントを表示する
6 # 6 以上を入力しても while ループは止まらない
7
8
9
10
12345
0 # 5 以下が入力されたので、while 内の if の条件が 真 になる
入力された値は 0 です. # if の中の print と last 演算子が実行されてループを抜ける
# プログラムが終了する
last は、繰り返し処理をコントロールする演算子のひとつです。この仲間に、next や redo があります。
* chomp は改行を取り除く機能、<STDIN> は標準入力 (通常はキーボード) からの入力受付機能です。
0x0f-> 0x10 へ
次回は桁が上がって、0x10 回になります。
2 進数や 16 進数をはじめて覚えた時に、僕は、桁上がりのイメージをうまくつかめませんでした。
イメージがつかめない原因は、10 進数で言うところの "じゅう" や "ひゃく" といった呼称でした。
「10」や「100」といった値を見ると、僕は反射的に "じゅう" や "ひゃく" と読んでしまうのです。
2 進数、 16 進数でいう「10」や「100」は、10 進数でいう "じゅう" や "ひゃく" とは意味が違うのに、頭の中で、"じゅう" や "ひゃく" と読んでしまうと、10 進数の意味に意識が引っ張られてしまうわけです。
それから、僕は意識して、「10」を "いちぜろ"、「100」を " いちぜろぜろ" と読むことにしました。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x10) へ続く。
過去記事 RSS
while ループ文で、インクリメントまたはデクリメント (に限らず、意図してループを抜ける処理) がない場合にいったんループがはじまると、Perl 側では、自発的にループを止めるすべがありません。
$num = 0;
while ( $num <= 9 ) {
print "\$num の値は $num です。\n";
}
上記のプログラムを実行すると、Perl は延々と「$num の値は 0 です。」を繰り返し表示します。while の条件式がずっと 真 のままだからです。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
$num の値は 0 です。
:
.
この様な状態を「無限ループ ( Infinite loop)」と呼びます。
Ctrl (コントロール) + c (シー)
意図しない無限ループは、意図した処理ではないので、その出会いは突然訪れます。僕が初めてこの現象に遭遇した時は、走り続けるプログラムを目の当たりにして、固まってしまいました。
「あ…ありのまま 今 起こっている事を話すぜ!」
と言っている間も、プログラムは無機質なメッセージを繰り返し表示し続けます。すると、近くにいた友人が 「Ctrl + c 」と呟きました。
そうです、仮にあなたのプログラムが、同様の状態に陥ったなら、冷静にキーボードを見据えて、Ctrl + c を押してください。
Ctrl + c は、利用しているシステムが提供する、プログラムを強制的に停止する機能です。恐怖に駆られてシステムの電源を落とす必要はありません。
システムによっては別のキーを押す場合がありますが、ほとんどのシステムでは Ctrl + c で間に合うでしょう。そうでなければ、該当のシステムのドキュメントを読む必要があります。
プログラム上の意図しない無限ループの発生は、初心者の単純なミスによって発生しやすいものですが、プログラミングの上級者であっても、特に精密な数値解析を行う場合は、意図しない無限ループにハマり込むことがあるそうです。
また、身近なところでは、電子メールの転送設定で、転送先と転送元がお互いに転送しあうという様なループがあります。これも一種の無限ループにあたります。
単純ですが、なかなか深刻なケースなので、多角的なメール転送を行う場合は特に注意しましょう。
意図した 無限ループ
無限ループは、一見すると、ミスから誘発されるプログラムの暴走の様に見えますが、わりと多くのプログラム (たぶん、特に組み込み系) で、入力の待ち受けをする時に使われています。
通常無限ループは、意図しない場合に用いる言葉なので、意図する無限ループという用法は、おかしな用法です。
意図する無限ループは、何かしらループを抜ける条件を用意しますが、条件が満たされない限り、ループは延々と (システムから強制的に終了されるか、電源が落ちるまで) 回り続けます。
ほとんどの場合は、(ユーザの操作等) プログラムの外部からの入力を待ち受けます。
例えば以下の様にすると、要求された 5 以下の数値が入力されない限り、while 文はループを繰り返し続けます。
print "5 以下の 数値を入力して Enter キーを押してください:\n";
while ( 1 ) {
chomp ( my $num = <STDIN> );
if ($num <=5) {
print "入力された値は $num です。\n";
last;
}
}
3 行目の while の条件式には数値の「1」が入っています。
Perl では、数値の「0」および「(空文字)」、それと「undef」は 偽、これ以外の値はすべて 真 と判定するため、この while 文の条件式は、常に 真 と判定されます。
このため、while の条件式では、このループを止めることが出来ません。
代わりに、9 行目の if 文の処理の中に書かれた last という演算子が、ループを抜け出す処理を請け負います。
7 行目にある if 文の条件式が 真 と判定された場合、プログラムの処理は last に渡されて while ループを抜け出します。
上記の例では、ユーザが 5 以下の数値を入力して Enter キーを押すまで、while ループは回り続けます。
5 以下の 数値を入力して Enter キーを押してください: # 1 行目の print でユーザに入力を促すコメントを表示する
6 # 6 以上を入力しても while ループは止まらない
7
8
9
10
12345
0 # 5 以下が入力されたので、while 内の if の条件が 真 になる
入力された値は 0 です. # if の中の print と last 演算子が実行されてループを抜ける
# プログラムが終了する
last は、繰り返し処理をコントロールする演算子のひとつです。この仲間に、next や redo があります。
* chomp は改行を取り除く機能、<STDIN> は標準入力 (通常はキーボード) からの入力受付機能です。
0x0f-> 0x10 へ
次回は桁が上がって、0x10 回になります。
2 進数や 16 進数をはじめて覚えた時に、僕は、桁上がりのイメージをうまくつかめませんでした。
イメージがつかめない原因は、10 進数で言うところの "じゅう" や "ひゃく" といった呼称でした。
「10」や「100」といった値を見ると、僕は反射的に "じゅう" や "ひゃく" と読んでしまうのです。
2 進数、 16 進数でいう「10」や「100」は、10 進数でいう "じゅう" や "ひゃく" とは意味が違うのに、頭の中で、"じゅう" や "ひゃく" と読んでしまうと、10 進数の意味に意識が引っ張られてしまうわけです。
それから、僕は意識して、「10」を "いちぜろ"、「100」を " いちぜろぜろ" と読むことにしました。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x10) へ続く。
過去記事 RSS
意図しない無限ループは、意図した処理ではないので、その出会いは突然訪れます。僕が初めてこの現象に遭遇した時は、走り続けるプログラムを目の当たりにして、固まってしまいました。
「あ…ありのまま 今 起こっている事を話すぜ!」
と言っている間も、プログラムは無機質なメッセージを繰り返し表示し続けます。すると、近くにいた友人が 「Ctrl + c 」と呟きました。
そうです、仮にあなたのプログラムが、同様の状態に陥ったなら、冷静にキーボードを見据えて、Ctrl + c を押してください。
Ctrl + c は、利用しているシステムが提供する、プログラムを強制的に停止する機能です。恐怖に駆られてシステムの電源を落とす必要はありません。
システムによっては別のキーを押す場合がありますが、ほとんどのシステムでは Ctrl + c で間に合うでしょう。そうでなければ、該当のシステムのドキュメントを読む必要があります。
プログラム上の意図しない無限ループの発生は、初心者の単純なミスによって発生しやすいものですが、プログラミングの上級者であっても、特に精密な数値解析を行う場合は、意図しない無限ループにハマり込むことがあるそうです。
また、身近なところでは、電子メールの転送設定で、転送先と転送元がお互いに転送しあうという様なループがあります。これも一種の無限ループにあたります。
単純ですが、なかなか深刻なケースなので、多角的なメール転送を行う場合は特に注意しましょう。
意図した 無限ループ
無限ループは、一見すると、ミスから誘発されるプログラムの暴走の様に見えますが、わりと多くのプログラム (たぶん、特に組み込み系) で、入力の待ち受けをする時に使われています。
通常無限ループは、意図しない場合に用いる言葉なので、意図する無限ループという用法は、おかしな用法です。
意図する無限ループは、何かしらループを抜ける条件を用意しますが、条件が満たされない限り、ループは延々と (システムから強制的に終了されるか、電源が落ちるまで) 回り続けます。
ほとんどの場合は、(ユーザの操作等) プログラムの外部からの入力を待ち受けます。
例えば以下の様にすると、要求された 5 以下の数値が入力されない限り、while 文はループを繰り返し続けます。
print "5 以下の 数値を入力して Enter キーを押してください:\n";
while ( 1 ) {
chomp ( my $num = <STDIN> );
if ($num <=5) {
print "入力された値は $num です。\n";
last;
}
}
3 行目の while の条件式には数値の「1」が入っています。
Perl では、数値の「0」および「(空文字)」、それと「undef」は 偽、これ以外の値はすべて 真 と判定するため、この while 文の条件式は、常に 真 と判定されます。
このため、while の条件式では、このループを止めることが出来ません。
代わりに、9 行目の if 文の処理の中に書かれた last という演算子が、ループを抜け出す処理を請け負います。
7 行目にある if 文の条件式が 真 と判定された場合、プログラムの処理は last に渡されて while ループを抜け出します。
上記の例では、ユーザが 5 以下の数値を入力して Enter キーを押すまで、while ループは回り続けます。
5 以下の 数値を入力して Enter キーを押してください: # 1 行目の print でユーザに入力を促すコメントを表示する
6 # 6 以上を入力しても while ループは止まらない
7
8
9
10
12345
0 # 5 以下が入力されたので、while 内の if の条件が 真 になる
入力された値は 0 です. # if の中の print と last 演算子が実行されてループを抜ける
# プログラムが終了する
last は、繰り返し処理をコントロールする演算子のひとつです。この仲間に、next や redo があります。
* chomp は改行を取り除く機能、<STDIN> は標準入力 (通常はキーボード) からの入力受付機能です。
0x0f-> 0x10 へ
次回は桁が上がって、0x10 回になります。
2 進数や 16 進数をはじめて覚えた時に、僕は、桁上がりのイメージをうまくつかめませんでした。
イメージがつかめない原因は、10 進数で言うところの "じゅう" や "ひゃく" といった呼称でした。
「10」や「100」といった値を見ると、僕は反射的に "じゅう" や "ひゃく" と読んでしまうのです。
2 進数、 16 進数でいう「10」や「100」は、10 進数でいう "じゅう" や "ひゃく" とは意味が違うのに、頭の中で、"じゅう" や "ひゃく" と読んでしまうと、10 進数の意味に意識が引っ張られてしまうわけです。
それから、僕は意識して、「10」を "いちぜろ"、「100」を " いちぜろぜろ" と読むことにしました。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x10) へ続く。
過去記事 RSS
無限ループは、一見すると、ミスから誘発されるプログラムの暴走の様に見えますが、わりと多くのプログラム (たぶん、特に組み込み系) で、入力の待ち受けをする時に使われています。
通常無限ループは、意図しない場合に用いる言葉なので、意図する無限ループという用法は、おかしな用法です。
意図する無限ループは、何かしらループを抜ける条件を用意しますが、条件が満たされない限り、ループは延々と (システムから強制的に終了されるか、電源が落ちるまで) 回り続けます。
ほとんどの場合は、(ユーザの操作等) プログラムの外部からの入力を待ち受けます。
例えば以下の様にすると、要求された 5 以下の数値が入力されない限り、while 文はループを繰り返し続けます。
print "5 以下の 数値を入力して Enter キーを押してください:\n";
while ( 1 ) {
chomp ( my $num = <STDIN> );
if ($num <=5) {
print "入力された値は $num です。\n";
last;
}
}
3 行目の while の条件式には数値の「1」が入っています。
Perl では、数値の「0」および「(空文字)」、それと「undef」は 偽、これ以外の値はすべて 真 と判定するため、この while 文の条件式は、常に 真 と判定されます。
このため、while の条件式では、このループを止めることが出来ません。
代わりに、9 行目の if 文の処理の中に書かれた last という演算子が、ループを抜け出す処理を請け負います。
7 行目にある if 文の条件式が 真 と判定された場合、プログラムの処理は last に渡されて while ループを抜け出します。
上記の例では、ユーザが 5 以下の数値を入力して Enter キーを押すまで、while ループは回り続けます。
5 以下の 数値を入力して Enter キーを押してください: # 1 行目の print でユーザに入力を促すコメントを表示する
6 # 6 以上を入力しても while ループは止まらない
7
8
9
10
12345
0 # 5 以下が入力されたので、while 内の if の条件が 真 になる
入力された値は 0 です. # if の中の print と last 演算子が実行されてループを抜ける
# プログラムが終了する
last は、繰り返し処理をコントロールする演算子のひとつです。この仲間に、next や redo があります。
* chomp は改行を取り除く機能、<STDIN> は標準入力 (通常はキーボード) からの入力受付機能です。
0x0f-> 0x10 へ
次回は桁が上がって、0x10 回になります。
2 進数や 16 進数をはじめて覚えた時に、僕は、桁上がりのイメージをうまくつかめませんでした。
イメージがつかめない原因は、10 進数で言うところの "じゅう" や "ひゃく" といった呼称でした。
「10」や「100」といった値を見ると、僕は反射的に "じゅう" や "ひゃく" と読んでしまうのです。
2 進数、 16 進数でいう「10」や「100」は、10 進数でいう "じゅう" や "ひゃく" とは意味が違うのに、頭の中で、"じゅう" や "ひゃく" と読んでしまうと、10 進数の意味に意識が引っ張られてしまうわけです。
それから、僕は意識して、「10」を "いちぜろ"、「100」を " いちぜろぜろ" と読むことにしました。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x10) へ続く。
過去記事 RSS
次回は桁が上がって、0x10 回になります。
2 進数や 16 進数をはじめて覚えた時に、僕は、桁上がりのイメージをうまくつかめませんでした。
イメージがつかめない原因は、10 進数で言うところの "じゅう" や "ひゃく" といった呼称でした。
「10」や「100」といった値を見ると、僕は反射的に "じゅう" や "ひゃく" と読んでしまうのです。
2 進数、 16 進数でいう「10」や「100」は、10 進数でいう "じゅう" や "ひゃく" とは意味が違うのに、頭の中で、"じゅう" や "ひゃく" と読んでしまうと、10 進数の意味に意識が引っ張られてしまうわけです。
それから、僕は意識して、「10」を "いちぜろ"、「100」を " いちぜろぜろ" と読むことにしました。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0x10) へ続く。
過去記事 RSS
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)