[PR]tDl:I]]Eタ


結婚記念日を表示します(その1)

=Perl, =結果


紙婚式とか金婚式、多くの種類がありますね。とても覚えきれません。そこで結婚記念日を入力して、いつが記念日なのか調べられるようにしたいと思います。

そのためには、何年目が何婚式なのか調べなくてはいけません。しかし調べてみると、色々とありますね。同じ三周年でも様々な呼び方があります。しかもダイヤモンド婚式のようにアメリカとイギリスでは年数が異なります。


STEP1
先ずは単純に結婚記念日を表示させて見ましょう。

何年目が何婚式かを収めたデータを作っておきましたので、そのデータ(wedding.txt)を読み込んで表示させます。wedding.txtには、このように書かれています(→wedding.txt)。

CGIを実行しますl_wedding_1.cgi

wedding.txtを表示させるだけのCGIです。
#!/usr/local/bin/perl

$title = "結婚記念日を教えてください!(1)";

print "Content-type: text/html\n\n";
require 'heder.txt';# ヘッダー読み込み

open (WEDDINGDATA, './wedding.txt');
while (defined($line = <WEDDINGDATA>)) {
	print "$line<br>";
}
close(WEDDINGDATA);

require 'fotter.txt';# フッター読み込み
exit;


#!/usr/local/bin/perl
どこにPerlがあるかを宣言しています。(「先ずはこれ」参照)


$title = "結婚記念日を教えてください!(1)";
$titleと名前を付けた変数に、["]で囲まれた部分の文字列を代入しています。(「決り文句を呼び込む」の「変数」の項参照)


print "Content-type: text/html\n\n";
ブラウザにHTML文であることを教えています。(「先ずはこれ」参照)


require 'heder.txt';# ヘッダー読み込み
【→Perl Reference: require
私のPerlスクリプトでは頻繁に出てくるパターンです。requireを使って、他のファイルを読み込んでいます。ここではCGIと同じディレクトリに置かれたheder.txtを読み込んでいます。heder.txtは下のように書かれています。[#]から始まる部分は単なるメモとしてPerlは無視をします。
print qq|
<html>
<head><title>$title</title>
<meta http-equiv="Content-Type" content="text/html; charset=x-euc-jp">
<link rel="stylesheet" type="text/css" href="../cocohomestyle.css">
</head>
<body LINK="#006EFF" VLINK="#006EFF">
|;

1;
HTML開始の決り文句を、各スクリプト毎に毎回書くことが面倒なので、requireを使って読み込むようにしています。<TITLE>から</TITLE>の間に入れるタイトルは各スクリプトごとに変わりますので、メインのスクリプトで宣言しています。このスクリプトのタイトル$titleは「結婚記念日を教えてください!(1)」となります。requireで取り込まれるファイルの最後の行には 1; を書きます。この 1; を読むことができれば、requireは成功したと判断されます。(「決り文句を呼び込む」参照)

さてメインのファイルの操作部分の説明は後にして、下から二行目にもう一度require文が出てきますので、先に説明をしておきます。
require 'fotter.txt';# フッター読み込み
fotter.txtを読み込んでいます。fotter.txtにはHTML終了記述が書かれています。各ページの舌の部分にある「Coco's Home」などへのリンク記述などです。このように、各スクリプトに直接記述しないことで、リンクの情報が変わったときには、fotter.txtだけを変えれば各各スクリプトは書き換える必要がなくなります。下にfotter.txtの内容を表示しておきます。(「決り文句を呼び込む」参照)

print qq(
<hr>
<center>
<font size="1">| <a href="Javascript:history.back()">Back</a> | |
 <a href="../../index.html">Coco's Home</a> | |
 <a href="../index.html">ココとPerlで遊びませんか</a> | |
<hr>
Copyright 2001-2002 Coco's Home. All rights reserved.</font>
</center>
</body>
</html>
);

1;


exit;
ここで処理は終了です。


それでは、ファイルの読み込みに戻ります。
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のデータは一行毎に三つの内容が書かれています。一番最初の行でデータの構成の説明をしていますが、[何周年目か]、次は[結婚記念日の呼び名]、最後に[別の呼び名]の順となっています。各項目はセミコロン(;)で区切られています。


STEP2
先ほどのスクリプトl_sedding_1.cgiでは一行毎に$lineに代入して、それを表示させていましたが、今度はの一行のデータを三つに分けて格納することにして見ましょう。

CGIを実行します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);


split(/パターン/,文字列)
@item = split(/;/,$line)
【→Perl Reference: split
文字列$lineをパターン ;(セミコロン) で分けて、配列 @item に格納しています。@item にはセミコロンで分けられたデータ $item[0]、$item[1]、$item[2]が下のように格納されます。
配列$item[0]$item[1]$item[2]
元データ1;紙婚式;;
元データ2;綿婚式;藁婚式;
元データ3;革婚式;草婚式,菓婚式,果婚式;


STEP3
折角、細かくデータを分けたのですから、それぞれをもう少し分かりやすく表示したいですね。

CGIを実行します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参照)


STEP4
一行目のデータは単にwedding.txtに書き込むときのメモですので、表示させる必要はありませんね。それから別名$item[2]にデータが無い時も表示しなくていいですね。

CGIを実行します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の数字で始まるデータのみを処理するようにしています。言い換えると、数字で始まらない行のデータは処理しないようにしています。

if ($item[2] eq "") {  }
$item[2]には結婚記念日の別の呼び方を記述しています。別の呼び方が書かれていないときの処理です。if ($item[2] eq "") は$item[2]がヌル(空白)の場合を指しています。
空白のときは</p>だけをprintし、そうでないとき($item[2]がヌルでない)はelse以降をprintします。


STEP5
ついでに、表組みにしてみましょう。

CGIを実行しますl_wedding_5.cgi

#!/usr/local/bin/perl

$title = "結婚記念日を教えてください!(5)";

print "Content-type: text/html\n\n";
require 'heder.txt';# ヘッダー読み込み

print "<center>\n";
print "<table border=\"1\" bgcolor=\"#DDFFFF\"><tr>";
	print "<tr bgcolor=\"#FFAAAA\"><td align=\"center\" colspan=\"3\"><font size=\"+2\"><b>結 婚 記 念 日</b></font></td></tr>";
print "<tr bgcolor=\"#FFAAAA\"><td><b>年数</b></td><td><b>名称</b></td><td><b>別称</b></td></tr>\n";

open (WEDDINGDATA, './wedding.txt');
while (defined($line = <WEDDINGDATA>)) {
	if ($line =~ /^[1-9]/) {
	@item = split(/;/,$line);
	print "<tr><td align=\"center\">$item[0]年</td><td>$item[1]</td><td>";
		if ($item[2] eq "") {
			print "</td></tr>\n";
		} else {
			print "$item[2]</td></tr>\n";
		}
	}
}
close(WEDDINGDATA);
print "</table>\n";

require 'fotter.txt';# フッター読み込み
exit;
スクリプトは少し長くなりましたが、print文でHTMLのテーブルタグ記述に書き換えただけです。

これでデータを読み込んで、結婚記念日の一覧表を作成することができました。でもこれだけだったら、何もCGIで実行させる必要はありませんね。最初からHTMLで書いてしまえばいいのですから。


STEP6
それでは、次はサイトに訪問していただいた方に、結婚年月日を入力してもらい、その人だけの結婚記念日を表示させてみましょう。

<table border="1">
<tr><td align="center"><b>結婚記念日を教えて</b></td></tr>
<tr><td><form action="./cgi-bin/l_wedding_6.cgi" method="GET" target="new">
<b>西暦<input type="text" name="wy" maxlength="4" size="4">年
<input type="text" name="wm" maxlength="2" size="2">月
<input type="text" name="wd" maxlength="2" size="2">日</b>
<input type="submit" value="GO!"></td>
</form></tr>
</table>

上のソースで下の入力フォームを表示させています。結果は別のウインドに表示されるようにしています。

結婚記念日を教えて
西暦

年をwy、月をwm、日をwdとして、l_wedding_6.cgiに渡すようになっています。
method="GET"
メソッドは GET を使っています。受け渡し方法には GET と POST がありますが、詳しくは「テキストの色替え」のPOSTとGETを参照してください。


それではデータを処理するスクリプトで、先ほどの入力フォームから送られてきたデータを表示させてみましょう。

#!/usr/local/bin/perl

require './stdin.txt';# GET,POST処理

$title = "結婚記念日を教えてください!(6)";
$weddingyear = $FORM{'wy'};# 入力年
$weddingmon = $FORM{'wm'};# 入力月
$weddingday = $FORM{'wd'};# 入力日

print "Content-type: text/html\n\n";
require 'heder.txt';# ヘッダー読み込み

print "年=$weddingyear,月=$weddingmon,日=$weddingday";

print "<center>\n";
print "<table border=\"1\" bgcolor=\"#DDFFFF\"><tr>";
	print "<tr bgcolor=\"#FFAAAA\"><td align=\"center\" colspan=\"3\"><font size=\"+2\"><b>結 婚 記 念 日</b></font></td></tr>";
print "<tr bgcolor=\"#FFAAAA\"><td><b>年数</b></td><td><b>名称</b></td><td><b>別称</b></td></tr>\n";

open (WEDDINGDATA, './wedding.txt');
while (defined($line = <WEDDINGDATA>)) {
	if ($line =~ /^[1-9]/) {
	@item = split(/;/,$line);
	print "<tr><td align=\"center\">$item[0]年</td><td>$item[1]</td><td>";
		if ($item[2] eq "") {
			print "</td></tr>\n";
		} else {
			print "$item[2]</td></tr>\n";
		}
	}
}
close(WEDDINGDATA);
print "</table>\n";

require 'fotter.txt';# フッター読み込み
exit;

require './stdin.txt';# GET,POST処理
requireでstdin.txtを読み込みます。このstdin.txtにはPOSTやGET処理の処理方法について規定しています。POSTでもGETでもこのstdin.txtで対応できるようになっています。stdin.txtの記述や説明は、先ほどと同じ「テキストの色替え」のPOSTとGETを参照してください。

$weddingyear = $FORM{'wy'};# 入力年
$weddingmon = $FORM{'wm'};# 入力月
$weddingday = $FORM{'wd'};# 入力日
ここでは入力フォームから送られてくるデータの設定をしています。入力フォームからは、年(wy)月(wm)日(wd)が送られてきます。送られてきたそれぞれを年($weddingyear)月($weddingmon)日($weddingdayd)に代入しています。

print "年=$weddingyear,月=$weddingmon,日=$weddingday";
代入したそれぞれを表示しています。

年=1999,月=9,日=9
1999年9月9日と入力すると、上のように表示されました。URLを見ると
http://(略)/cgi-bin/l_wedding_6.cgi?wy=1999&wm=9&wd=9
のようになっていて、GETでデータが送られたことが分かります。

入力フォームからデータをCGIに送り、それを変数に代入して、さらに表示することができています。次のステップでは、この年月日を使って表示に工夫をします。


STEP7
それでは最後のステップですが、ページが長くなりましたので、次のページに続きます。


| 結婚記念日を表示します(その1) | 結婚記念日を表示します(その2) |


| Back | Coco's Home | ココとPerlで遊びませんか |

Copyright 2001-2002 Coco's Home. All rights reserved.

[PR]lvZ@ff:EllI