Perl/CGIプログラムのループの種類
今回は、ループ処理(繰り返し処理)について学習します。
編集前記
Perl/CGIプログラミング学習も、今回で4回目となりました。
今回は今後も伸びてくるであろうクラウドコンピューティング的な話をします。
クラウドコンピューティング(cloud computing)とは、ネットワーク上で提供されるさまざまなサービスのことです。
↑ものすごくアバウトな説明ですが(苦笑)。
まぁようするに、パソコンのウェブブラウザがインターネット経由で受けることのできるさまざまなサービスのことです。
データを管理しているサーバーにクライアントとして接続し、さまざまなサービスを受けるわけですから、パソコンや携帯といった端末に関係なく同じサービスを受けることができます。
イメージしやすいところで言えば、ウェブメールでしょうか…。
ウェブメールとは、サーバーがメールを受信したり送信したりするように作られたシステムのことです。
近年は個人でも複数のパソコンを持つようになりましたよね。
そうなると、パソコン用のメールをどのパソコンでチェックするのかということが問題になってきますよね。
複数のパソコンで別々にメールを受信してもよいのですが、後で読み返そうと思ったとき…
「あれ、あのメールどこにいったかな?」
ということになりますよね。
そんなとき、ウェブメールのようなサーバー側で電子メールを管理できるようなシステムがあれば、どのパソコンからメールをチェックしてもサーバーに残るわけですから問題ないですよね。
それどころか、インターネットに接続できる端末があれば良いわけですから、携帯からでもパソコン用のメールをチェックできるようになるわけです。
これがクラウドコンピューティングの利点ですね。
知り合いの会社では、カレンダーベースの日報掲示板が社内サーバーに設置してあるそうです。
なので、誰がどんな仕事をしていて、その仕事がどれだけ進んでいるのかが一目でわかるそうです。
しかもログを消していないらしいので、1年前はどんな仕事をしていたのかということが、読み返すだけで手に取るようにわかるそうです。
これはたしかに便利そうですよね。
これもクラウドコンピューティングですよね。
ほかにもいろいろなサービスが提供できるとは思いますが…。
これらウェブシステムを効率的に構築するには、Perl/CGIプログラムを利用するのが簡単です。
すでに一般的なものはインターネット上に出回っているので、探せば結構良い物が出てきます。
でも、このページを読んでいるほとんどの人は、独自で何らかのサービスを提供できないかと考えているかと思います。
そうなると、やはりPerl/CGIプログラミング知識がほとんど必須になってくることはわかりますよね。
かりに自分でプログラミングしないとしても、プログラマーに要求を出すためには、ある程度プログラムに関して知識を持っていないと突っ込んだ話はできませんからね。
そういった意味でも、今後さらに伸びてくるであろうクラウドコンピューティングに備えて、Perl/CGIプログラミング知識を身に付けておきましょう!
それでは、今回の学習を始めましょう。
ループとは?
ループ処理とは、繰り返し行われる処理のことです。
たとえば、繰り返し行われる処理を用意しておき、プログラム処理の順番が回ってきたら…。
「ある条件」を提示し、その指定した条件が満たされるまでもしくは、その条件が満たされなくなるまで同じ動作を繰り返させるというものです。
以前の記事で変数の利点として、たとえ値そのものが変わっていても変数を利用していれば、常に同じプログラムコードが利用できるということを解説しましたね。
今回のループ処理もこれと同じ感覚で、ループ部分のプログラムコードを一つ用意しておけば、実行時の条件により何回でも同じ処理を繰り返してくれます。
それでは具体的に、Perlプログラミングでのループ処理(くりかえし処理)というのを説明していきます。
<戻る>
forループ
まずは、for関数を使ったループプログラミング方法から解説します。
for関数はPerl/CGIプログラムに限らず、JavascriptやC言語など、いろいろなプログラミング言語で登場するぐらい有名なループ命令です。
forループの基礎
for関数を使用したループ処理では、一つキーとなる単純変数を用意し、その変数内が変化することによりループする回数や、ループに入るのか抜けるのかといったことを決めることができます。
具体的には…。
「キーとなる変数の初期設定」
「ループ処理を行う条件」
「一度処理が終了するごとにキーとなる変数に行う処理」
この3つを設定しループを開始します。
1つ目の「キーとなる変数の初期設定」でループ開始前に、キーとなる変数の初期化をします。
3つ目の「一度処理が終了するごとにキーとなる変数に行う処理」でループ処理が1度終了するごとにキーとなる変数に処理を加えて徐々に変化をつけます。
そして、2つ目の「ループ処理を行う条件」が満たされている限り、ループ処理を実行し続けるといった仕組みです。
こんな感じでコーディングします。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
for ($i=0;$i<10;$i++) {
print $i;
}
exit;
このPerl/CGIプログラムを実行すると…。
「0123456789」
と表示されます。
ループを指定しているところは当然「for ($i=0;$i<10;$i++)」という部分ですね。
前述しました3つの条件を「;」で区切っているだけなので…。
1つ目の条件「キーとなる変数の初期設定」は、「$i=0」で…。
変数「$i」に初期値である「0」を代入しています。
2つ目の条件「ループ処理を行う条件」は、「$i<10」で…。
変数「$i」が「10」より小さい間、ループ処理を実行し続けるという意味です。
3つ目の条件「一度処理が終了するごとにキーとなる変数に行う処理」は、「$i++」で…。
変数「$i」に、1をプラスするという意味です。
「++」の詳しい解説については後述します。
そして、繰り返し処理が行われる部分は、「{」から「}」の中つまり「print $i;」というわけですね。
表示された「0123456789」というのは、変数「$i」内の数値です。
変数「$i」が0から9まで合計10回変化する間、ループ処理が行われたことをあらわしています。
for関数を使ったループ処理の基本は以上です。
forループの応用
forループの使用用途はさまざまですが、主に配列変数や連想配列を順に処理させるときなどに使うパターンが多いです。
forループと配列変数や連想配列を組み合わせることにより、少ないプログラムコードで大量の変数にアプローチすることができるからですね。
まぁこれは、forループに限った話ではなく、すべてのループ処理に言えることですが…。
ここでは、前述のforループの基礎を踏まえたうえで、配列変数を効率的に処理していく方法について学習していきます。
まずは、以下のプログラムコードを見てください。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
for ( $i=0 ; $i<=$#array ; $i++ ) {
print $array[$i];
print "<br>\n";
}
exit;
このPerl/CGIプログラムを実行すると、こんな感じで表示されます。
zero
one
two
three
配列の添え字順に、各要素に代入されているデータを表示させています。
ちなみに、このようにデータをある一定の条件の下で並べることをソート(sort)と言うので覚えておきましょう。
それでは、forループ処理の流れについて説明します。
まず、for文の開始には、変数「$i」に「0」が代入されます。
そして「$i<=$#array」という条件が成立している限り、ループ処理が実行され続けます。
これは以前の復習になりますが、「$#array」というのは、配列「@array」の一番最後に当たる一番大きな添え字を求めるやり方でしたね。
ようするにこの場合では「3」となるので、変数「$i」が「0」から「3」まで、4回のループ処理が行われるというわけです。
ループ処理が一度終了すると、変数「$i」に「1」が足されます。
「$i++」という部分がそうです。
この「++」とは、現在の数値に1を足しなさいという意味です。
このような「++」という表現方法のことを、プログラミングの専門用語でインクリメント演算子と言います。
ちなみに「--」と書けば、現在の数値から1マイナスします。
このような「--」という表現方法のことを、プログラミングの専門用語でデクリメント演算子と言うので、インクリメント演算子とセットで覚えておきましょう。
もちろん、デクリメント演算子を使っても、for関数でループ処理をコーディングすることもできます。
でもそうなると、当然ループ条件や出力されるデータの順番も変化しますから、目的によってしっかり使い分けられるようにしておきましょう。
例えば、先ほどのPerl/CGIプログラムをデクリメント演算子を使って書き換えると、以下のようになります。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
for ( $i=$#array ; $i>=0 ; $i-- ) {
print $array[$i];
print "<br>\n";
}
exit;
このPerl/CGIプログラムを実行させると、こんな感じで表示されます。
three
two
one
zero
表示されるデータがみごとに逆になりました。
書き換えたプログラム部分は、forの後の「(」から「)」内のループ条件のみです。
デクリメント演算子を使って要素の大きなものから小さなものに移動していくようにしたので、みごとに表示される順番がひっくり返ったというわけです。
インクリメント演算子とデクリメント演算子については、いつでも使いこなせるようにしておきましょう。
もう少し寄り道して、変数内の数値を加算または減算するのに、覚えておくと便利なやり方を紹介します。
インクリメント演算子やデクリメント演算子では、変数内の値を1つずつしか変化させられませんが…。
次の方法を使うと、変数内の数値を2つずつでも3つずつでも自由に加算もしくは減算できます。
仮に、2つずつ足していく場合は、「$i += 2」と書きます。
前述のPerl/CGIプログラムにあてはめると、こんな感じですね。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
for ( $i=0 ; $i<=$#array ; $i+=2 ) {
print $array[$i];
print "<br>\n";
}
exit;
このPerl/CGIプログラムを実行させるとこんな感じ…。
zero
two
ひとつずつ飛んでいますよね。
この「$i+=2」というのを、わかりやすく書き直すと「$i = $i + 2」となります。
変数「$i」に2を足した値を、再び変数「$i」に代入しているだけだということに気づくと思います。
このやり方が分かれば、いくつでも規則正しく加算したり減算できるようになりますよ。
foreachループ
ここでは、foreach関数を使って、ループ処理を作成する方法について解説します。
foreachループの基礎
foreach関数は、配列状に並べられたデータを順に処理していくのに便利な関数です。
データが配列状に並んでさえいれば配列に限らず、単純なデータの並びや連想配列であっても処理させることができます。
データ処理(1)
まずはforeach関数を使って、単純なデータの並びをループ処理でさばいてみます。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $number ('zero', 'one', 'two', 'three') {
print $number;
print "<br>\n";
}
exit;
このPerl/CGIプログラムを実行させると、以下のように表示されます。
zero
one
two
three
1回のループ処理でカッコ内に指定されているデータの1つが、変数「$number」に代入され、print関数で表示されます。
表示結果からもわかるように、カッコ内に指定されているデータの数だけループ処理が行われます。
この例では、4回ですね。
処理される順番は、基本的にカッコの左側から順に処理されます。
しかしreverse関数を使うと、カッコの右側から順に処理させることができます。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $number (reverse('zero', 'one', 'two', 'three')) {
print $number;
print "<br>\n";
}
exit;
このPerl/CGIプログラムを実行させるとこんな感じ…。
three
two
one
zero
ループ処理されるデータの順番が、みごとにひっくりかえりましたね。
foreach関数と、reverse関数は、セットで覚えておきましょう。
foreach関数を使ったループ処理の基本は以上です。
データ処理(2)
次も同じように、カッコ内に指定したデータを順に処理していくループを作るのですが…。
今度はその中でも、ある程度パターンの決まっているデータを処理させる方法についてみていきましょう。
例えば、以下のようなPerl/CGIプログラムを見てください。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $number (0..9) {
print $number;
}
exit;
このPerl/CGIプログラムを実行すると「0123456789」と表示されます。
以前の復習になりますが…。
今回のような「0」から「9」というような、あらかじめ順序が決まっているデータを扱う場合には「..」を使って開始と終了の値を指定するだけで、間の値を自動的に割り当ててくれるようになっています。
「0~9」以外にも、「a~z」や「A~Z」などの場合にも使用できます。
忘れてしまった場合は、配列変数の解説を読んで復習しておきましょう。
逆からループ処理させたい場合には、reverse関数を使って「foreach $number (0..9)」部分を…。
「foreach $number (reverse(0..9))」とすれば…。
「9876543210」と表示されるようになります。
配列変数処理
foreach関数を使って、配列変数をループ処理させる方法についてみていきましょう。
コーディング方法はこんな感じです。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
foreach $number (@array) {
print $number;
print "<br>\n";
}
exit;
このPerl/CGIプログラムを実行すると、こんな感じで表示されます。
zero
one
two
three
配列「@array」に格納されている文字列が、foreachを使用したことで、変数「$number」に一つ一つ格納された後「print」を使って表示されています。
配列「@array」から変数「$number」に、要素がわたせているあいだのみループ処理が実行されます。
要素をすべてわたし終わったら、foreachのループ処理が終了します。
連想配列処理
次に、連想配列を使ったforeachループコーディング方法について説明します。
前述の配列であれば添字が番号になっているので、黙っていても「0」番目の添字を持った変数から順に処理されていきました。
しかし、連想配列の場合は、添字が番号ではなくキーと呼ばれる文字列になっています。
以前の復習になりますが、連想配列にはキーと値という二種類のパートがありましたよね。
そのため、foreach関数で連想配列を扱う時には、一工夫して前述の配列と同じように扱っていくようなコーディング方法をしていく必要があるわけです。
どのようにして扱っていくのかというと…。
キーを中心にしてループ処理を作成していく場合と、値を中心にしてループ処理を作成していく場合の2種類をコーディングできるようにしていきます。
foreach関数という、とにかく配列状に並んだデータを順に処理していく仕組みはあるのですから…。
あとは、順に処理していく配列部分のデータを、キーにしていくのか値にしていくのかというだけの話です。
連想配列のキー処理
まずは、連想配列のキーを中心に置いたforeachループのコーディング方法についてみていきましょう。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
%AlphabetNumber = ('A' => 0, 'B' => 1, 'C' => 2, 'D' => 3);
foreach $key (keys %AlphabetNumber) {
print $key;
}
exit;
このPerl/CGIプログラムを実行するとどうなると思いますか?
アルファベット順で表示されると思いますか?
それとも、数値順に表示されると思いますか?
答えは、どちらもハズレです。
このPerl/CGIプログラムを実行すると「ADCB」と表示されてしまいます。
もしかすると、実行環境によって並ぶ順番は変わるかもしれませんが、アルファベット順で並ぶ可能性は少ないです。
では、アルファベット順で並べるにはどうすればよいか?
アルファベット順で並べるためには、連想配列のキーを指定して順次取り出している部分に、sort関数をはさみます。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
%AlphabetNumber = ('A' => 0, 'B' => 1, 'C' => 2, 'D' => 3);
foreach $key (sort keys %AlphabetNumber) {
print $key;
}
exit;
今度はちゃんと、「ABCD」と表示されるようになります。
連想配列の値処理
次は、連想配列の値を中心に置いたforeachループのコーディング方法についてみていきましょう。
変数名も変えていますが基本的には、先ほどの「keys」を「values」に替えるだけで、キーではなく値を取得することができるようになります。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
%AlphabetNumber = ('A' => 0, 'B' => 1, 'C' => 2, 'D' => 3);
foreach $value (values %AlphabetNumber) {
print $value;
}
exit;
このPerl/CGIプログラムを実行すると、「0321」と表示されます。
この場合も、ループ処理の順序はバラバラですので注意です。
数値順に表示させたい場合には先ほどと同じように、「foreach $value (values %AlphabetNumber)」部分にsort関数をはさみ…。
「foreach $value (sort values %AlphabetNumber)」とすれば、「0123」と表示されるようになりますよ。
foreachループの応用
次に、foreachループプログラミングコーディング方法の応用技を紹介しておきます。
ここで紹介するコーディング方法は、よく出てくるので覚えておくと便利ですよ。
まずは、以下のPerl/CGIプログラムを見てください。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
foreach $number (@array) {
print $number;
print "<br>\n";
}
exit;
前述の配列変数処理で例に挙げたプログラムです。
当然実行結果も同じで…。
zero
one
two
three
と表示されます。
配列「@array」から変数「$number」に、要素がわたせているあいだのみループ処理が実行されます。
要素をすべてわたし終わったら、foreachのループ処理が終了します。
これを踏まえたうえで、foreachループの一部を省略して書くということについて学習していきましょう。
同じforeach文ですが、以下のようにforeachをforに、さらに変数「$number」を省略して書くことができます。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
for (@array) {
print;
print "<br>\n";
}
exit;
このPerl/CGIプログラムを実行すると、同じように「zero」から「three」まで、すべての配列の要素が順に表示されます。
確かに変数「$number」はなくなりました。
でもそうすると、なんとなくプログラムの流れがイメージしにくくなったかもしれませんね。
しかしこのような構文を書いた時には、配列状態のデータを一つ一つ順に取り出して処理させるというのがお決まりになっているので…。
もし今回のように、カッコ内の配列状態のデータを一つ一つ順に受ける変数がなかった場合でも、コンピューター側で自動的に変数を用意し代用する仕掛けになっています。
どんな変数を代用したのかというと…。
「$_」という名前の変数です。
この「$_」という変数は、コンピューター側で自動的につけられている変数なので、プログラムコード上に書いても書かなくてもよい変数です。
「プログラム上にわざわざ書かなくても存在している変数」まるでお化けみたいなイメージですが…。
ちゃんと指定してやれば実体が出てくるので、お化けよりはずっと扱いやすいです(笑)。
例えばこのプログラムでは、「print;」のみで「$_」内のデータを表示させていますが…。
「print;」ではなく、「print $_;」と書き換えることもできるのです。
このような変数のことを、特殊変数といいます。
特殊変数は、コンピューター側が特別に用意している数種類の変数で、プログラムコードにより適切な値を自動的に代入してくれる便利な変数です。
Perl/CGIプログラムコードをすっきりわかりやすく書けるのも、この特殊変数のおかげだといっても過言ではありません。
最初はイメージしにくいですが、いろいろなパターンを学習していくうちにわかるようになってきますから、がんばっていきましょう。
<戻る>
whileループ
次は、while関数を使ったループ処理について解説します。
whileループも前述したforeach文やfor文と同じように、条件が満たされているときのみループ処理を行う関数です。
しかし、while関数には前述した二つのループ関数にはない、おもしろい使い方をすることができる特徴があるのでここで学習しておきましょう。
そのおもしろい特徴とは…。
while関数には、ループ条件の前判定と後判定の二種類を使い分けることができるというところです。
ループ条件の前判定と後判定とはどういうことでしょうか?
文字通り、ループ処理を行う条件を前で判断するのか、後で判断するのかということなのですが…。
これだけでは少しイメージしにくいと思うので、具体例をあげてもう少しわかりやすく解説します。
まずは、whileループの前判定と後判定の基本から学習していきましょう。
前判定
whileループの前判定から解説します。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
$count = 0;
while ($count <= $#array) {
print $array[$count];
print "<br>\n";
$count++;
}
print "END";
exit;
このPerl/CGIプログラムを実行すると、以下のように表示されます。
zero
one
two
three
END
while関数の条件式「$count <= $#array」が成立している限り、ループ処理が行われます。
これは、最初に解説しましたfor関数の2つ目の条件式のみをピックアップしただけのループ処理と考えてもかまいません。
後判定
続いて、whileループの後判定をみていきましょう。
まずは、以下のPerl/CGIプログラムを見てください。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
$count = 0;
do {
print $array[$count];
print "<br>\n";
$count++;
} while ($count <= $#array);
print "END";
exit;
このPerl/CGIプログラムを実行すると、以下のように表示されます。
zero
one
two
three
END
からくりはこんな感じです。
do関数を無条件で通過しループ部分の処理を一度実行した後、さらにその後に続くwhile関数の条件式を判断し、ループを継続するかどうかを決めています。
この例では、「$count <= $#array」というのが条件式ですから、3回満たされることになります。
つまり、ループ部分のプログラムというのは、最初の無条件で実行される分をあわせて合計4回実行されることになるわけです。
前判定と後判定の違い
whileループの前判定と後判定の違いについて解説します。
例を挙げた方がわかりやすいので、以下のPerl/CGIプログラムコードを見てください。
前判定の例
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
$count = $#array;
while ($count < $#array) {
print $array[$count];
print "<br>\n";
$count++;
}
print "END";
exit;
後判定の例
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@array = ('zero', 'one', 'two', 'three');
$count = $#array;
do {
print $array[$count];
print "<br>\n";
$count++;
} while ($count < $#array);
print "END";
exit;
前判定では「END」のみが表示されるのに対し…。
後判定では「three」と「END」の2つが表示されます。
ちょっと例えがわかりにくかったかもしれませんが(苦笑)。
これがwhileループにおける前判定と後判定の違いです。
通常、ループ部分のプログラムというのは、前述のforeach関数やfor関数のように、先にループ条件がくるものです。
そしてそのループ条件によって、繰り返し処理が行われる回数がきめられるわけですよね。
その中には当然、ループ条件によってはループ部分の処理が1回も行われない場合もあるわけですよね。
しかし、whileループの後判定では、たとえループ条件を満たしていなかったとしても、最低一度はループ部分の処理が行われるのです。
前述の例のようなwhileループ条件を満たさない、前判定と後判定の2つのプログラムがあった場合…。
whileループの前判定では一度も実行されなかったループ部分のプログラムが、後判定では一度実行されてしまうということです。
後判定の例で、「three」が表示されてしまったのはこのためですね。
これは大きな違いですから、しっかり覚えておきましょう。
連想配列処理
最後に、whileループで連想配列を処理する方法についてみていきましょう。
前述の連想配列処理でのforeachループでは、連想配列のキーを軸にするか、値を軸にするかを決めて処理させていました。
しかしwhileの連想配列ループ処理では、each関数と組み合わせることにより、連想配列のペアーとなるキーと値の両方を同時に取り出し処理させるのが常套手段です。
#!/usr/bin/perl
print "Content-type: text/html\n\n";
%hash = ('Yahoo!' => 'http://yahoo.co.jp', 'Google' => 'http://google.co.jp');
while (($key, $value) = each %hash) {
print "$key : $value";
print "<br>\n";
}
exit;
このPerl/CGIプログラムを実行すると以下のように表示されます。
Yahoo! : http://yahoo.co.jp
Google : http://google.co.jp
連想配列「%hash」の各要素のキーと値を順に「$key」と「$value」に代入しながら、ループを繰り返します。
each関数はすべての要素を処理し終えると、それ以降代入処理をしなくなるので、while文がそれを判断しただちに終了するのです。
編集後記
今回は、Perl/CGIにおけるさまざまなループプログラミング方法を解説しました。
最後に、これらループプログラムを作成するうえで、プログラマーであれば絶対に知っておかなくてはいけないことがあるので紹介しておきます。
それは、Perl/CGIに限った話ではなく、すべてのプログラミング言語に共通して言えることなのですが…。
それは、無限ループを作らないということです!
無限ループとは、読んで字のごとく無限に繰り返されるループプログラムのことです。
今回学習した内容で説明するなら、ループ条件が満たされたままになっている状態のループプログラムのことです。
「無限」と大げさに言ってはいますが、相手はプログラムですから、パソコンの電源を切ってしまえば消えてなくなります。
しかし、無限ループにかかったプログラムというのは、当然正常に終了させることはできません。
終了できないプログラムというのは、電源が入っている限り動き続けてパソコンのメモリや頭脳であるCPUを消費し続けるのです。
結果、パソコン全体のパフォーマンスが低下します。
さらに、プログラム内容によっては、パソコン内のデータを壊してしまったり、他人に害を与えてしまう可能性だってあるわけです。
Perl/CGIプログラムはその性質上、インターネットサーバーで動かすことがほとんどだと思います。
インターネットサーバー提供会社によっては、これらPerl/CGIプログラムの無限ループ対策として…。
Perl/CGIプログラムが独占してCPUを使用できる秒数を設けているところもあります。
つまり、指定された秒数を超えてPerl/CGIプログラムが動作し続けた時は、無条件で強制停止させる仕組みがあるわけです。
しかし、そのような仕組みを設けていないインターネットサーバー会社というのも実はあります。
そのようなところで無限ループなどを使って、インターネットサーバーのCPUを消費し続けその結果、パフォーマンスを著しく低下させた場合には…。
世にも恐ろしいことが起こってしまうかもしれないということを、覚えておきましょう。
当然、故意であろうが事故であろうが関係ありませんので、今回学習しましたループプログラミングはしっかりマスターしておきましょう。
ここまで無限ループにまつわる恐怖を書いてみましたが…。
誤解を避けるためにもう少し補足しておきますと…。
プログラム上でなら、無限ループコードを書いてもかまいません。
どういうことかというと、プログラム実行時に無限ループに入ったままになってしまうのがいけないということです。
つまり、無限ループに入ってしまっても、しっかり脱出できる方法を用意しておきましょうということです。
個人的には、プログラムコードを書く段階で無限ループは避けた方がよいとは思うのですが…。
無限ループコードというのは、何かとエラーの原因になることが多いので…。
今回の学習テーマ、Perl/CGIプログラミングにおけるループ処理の解説は以上です。
しっかり復習しておいてくださいね。
ありがとうございました。
<戻る>