ここで処理は終了です。
それでは、ファイルの読み込みに戻ります。
open (WEDDINGDATA, './wedding.txt');
while (defined($line = <WEDDINGDATA>)) {
print "$line<br>"
}
close(WEDDINGDATA);
|
ここでは二つの説明をします。一つ目はファイル操作openです。Perlでは別ファイルを読み込むときopenを使います。openは,任意のファイルハンドル(この場合WEDDINGDATA)と対象のファイル名(wedding.txt)を指示してファイルを開きます。そしてcloseを使ってファイルを閉じています。(「きょうは何の日」のopenとclose参照)
【→Perl Reference: open】
【→Perl Reference: close】
二つ目は処理の繰り返し、whileです。whileの次の括弧内に条件式を書き、条件が正しいときの処理内容を"{"から"}"の間に書き入れます。
ファイルハンドルWEDDINGDATAのデータを一行ずつ読み込み、それを$lineに代入して、printで表示を繰り返します。そしてファイルの読み込みが終了したら、whileの繰り返しを終了します。
これで実に単純ですが、「結婚記念日を表示」ができました。しかし寂しすぎますので、もう少しプログラムらしくしましょう。
先ほどの表示では、
周年;式;別名;
1;紙婚式;;
2;綿婚式;藁婚式;
3;革婚式;草婚式,菓婚式,果婚式;
|
上のように表示されていましたね。このwedding.txtのデータは一行毎に三つの内容が書かれています。一番最初の行でデータの構成の説明をしていますが、[何周年目か]、次は[結婚記念日の呼び名]、最後に[別の呼び名]の順となっています。各項目はセミコロン(;)で区切られています。
先ほどのスクリプトl_sedding_1.cgiでは一行毎に$lineに代入して、それを表示させていましたが、今度はの一行のデータを三つに分けて格納することにして見ましょう。
l_wedding_2.cgi
結果はどうですか。セミコロン(;)が見えなくなっていますね。先ほどのl_wedding_1.cgiとの違いはsplit関数を使って配列に読み込んでいるだけです。
open (WEDDINGDATA, './wedding.txt');
while (defined($line = <WEDDINGDATA>)) {
@item = split(/;/,$line);
print "@item<br>";
}
close(WEDDINGDATA);
|
【→Perl Reference: split】
文字列$lineをパターン ;(セミコロン) で分けて、配列 @item に格納しています。@item にはセミコロンで分けられたデータ $item[0]、$item[1]、$item[2]が下のように格納されます。
| 配列 | $item[0] | | $item[1] | | $item[2] | |
| 元データ | 1 | ; | 紙婚式 | ; | | ; |
| 元データ | 2 | ; | 綿婚式 | ; | 藁婚式 | ; |
| 元データ | 3 | ; | 革婚式 | ; | 草婚式,菓婚式,果婚式 | ; |
折角、細かくデータを分けたのですから、それぞれをもう少し分かりやすく表示したいですね。
l_wedding_3.cgi
open (WEDDINGDATA, './wedding.txt');
while (defined($line = <WEDDINGDATA>)) {
@item = split(/;/,$line);
print "<p>結婚$item[0]年目は『$item[1]』と呼ばれています。<br>\n";
print "別名$item[2]とも呼ばれていますが。</p>\n";
}
close(WEDDINGDATA);
|
結婚3年目は『革婚式』と呼ばれています。
別名草婚式,菓婚式,果婚式とも呼ばれていますが。
|
print文を少し変えただけです。"\n"は改行の意味です。HTMLの改行<BR>とは異なります。<BR>はブラウザで見ると改行されますが、"\n"はHTMLのタグではありません。(「先ずはこれ」の\n参照)
一行目のデータは単にwedding.txtに書き込むときのメモですので、表示させる必要はありませんね。それから別名$item[2]にデータが無い時も表示しなくていいですね。
l_wedding_4.cgi
open (WEDDINGDATA, './wedding.txt');
while (defined($line = <WEDDINGDATA>)) {
if ($line =~ /^[1-9]/) {
@item = split(/;/,$line);
print "<p>結婚$item[0]年目は『$item[1]』と呼ばれています。<br>\n";
if ($item[2] eq "") {
print "</p>\n";
} else {
print "別名$item[2]とも呼ばれていますが。</p>\n";
}
}
}
close(WEDDINGDATA);
|
if文は条件判断です。
if(条件式){条件式に当てはまるときの処理}
条件式に当てはまらない時はelseを使います。(「最近太った?」のif, if-elsif-else参照)
if ($line =~ /^[1-9]/) { }
|
=~ でマッチするかを調べています。[1-9] は1から9までの数字を意味し、^ は文字列の先頭を意味します。
wedding.txtの数字で始まるデータのみを処理するようにしています。言い換えると、数字で始まらない行のデータは処理しないようにしています。
$item[2]には結婚記念日の別の呼び方を記述しています。別の呼び方が書かれていないときの処理です。if ($item[2] eq "") は$item[2]がヌル(空白)の場合を指しています。
空白のときは</p>だけをprintし、そうでないとき($item[2]がヌルでない)はelse以降をprintします。
ついでに、表組みにしてみましょう。
l_wedding_5.cgi
|