blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_0

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

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










同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲