ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

かきぞめCGIの解説

 お正月にASHのページに来ていただいた方ならご覧になったことがあると思うが、5、7、5のランダムテキストを縦書きするCGIがある。動作しているものはこちら。perlのソースはこれ
 このCGIはASHオリジナルなものなのだが、今回は、PerlによるCGIの説明もかねて、このプログラムの簡単な解説をしてみよう。

簡略化したプログラムの解説

 このプログラムのおおまかな動作としては、5文字と7文字(文字数はバラバラだが)の単語データが格納されたファイルがあり、それから5文字データ、7文字データを読み込み、それらからランダムで単語を抽出、整形して表示するというわけだ。
 ここでは、5文字データを1つだけ表示するように簡略化したソースを使って、解説しようと思う。実際のプログラムは各処理を3回ずつ繰り返しているだけなのだから。で、簡略化したソースはこれ。動作させるとこんな感じである。
 ちなみに単語の入ったファイルはこんな感じである。1行に1つづつ単語が書かれているだけのテキストファイルである。

初期設定

#!/usr/local/bin/perl

##############
# 初期設定 #

$fives = './five.txt';          # 5文字単語ファイル

 #!/usr/local/bin/perlで、perlのパスを指定し、このスクリプトをperlインタープリタで実行するように指定する。
 また、データファイルのファイル名を変数$fivesに代入している。

データ読み込み

################
# メイン処理 #

# データ読み込み(5)
open(DATAIN, "$fives");
@five = ;
close(DATAIN);

 外部ファイル(変数$fivesで表されたファイル、実際はfive.txt)を開き、配列変数@fiveにその内容を読み込む。
 Perlでは、改行コードごとにデータは区切られ、配列の各要素には、five.txt内の単語が格納される。

乱数発生及び単語決定

# 乱数発生&単語確定
$num1 = int(rand(@five));

$word1 = $five[$num1];

chomp($word1);

 関数randで0から配列変数@fiveの要素数までの乱数を発生させ、関数intで小数点以下を切り捨て、変数$num1にその値を代入する。配列変数@fiveをスカラーコンテキストで評価する(よーするに、配列じゃなく、1次元的な要求をする…?)と、配列の要素数を返すので、それを利用しているのだ。
 そして、配列変数@fiveの変数$num1番目の要素(最初の要素は0番めとなる)を変数$word1に代入する。(配列変数@arrayの各要素を使う場合は、@arrayではなく$array[0]$array[1]という記述になる)
 さらに、chomp関数で改行コードを切り捨てている。(chomp関数はperl5の関数、より賢いchop関数である)

文字を切り離す

# 文字をバラバラにする
$cha = length($word1)/2;

for ($i = 0; $i < $cha; $i++){
$char1[$i] = substr($word1,$i*2,2);
}

 縦書きで表示するために、単語を文字ごとにバラバラにしている。変数$word1の長さを2で割った数(変数$word1の内容は2バイト文字なので、その値は変数$word1の文字数に等しい)を、変数$chaに代入。
 for文で変数$cha回ループさせ、substr関数によって変数$wordの内容を2バイトずつ(1文字ずつ)配列変数@char1に代入している。

HTML前半部分出力

# 表示開始
print <<"eof";
Content-type: text/html


<html><head>
<title>かきぞめ</title>
</head>
<body bgcolor="ff8888">
<center>
<h1>
かきぞめ
</h1>
<table border=3 bgcolor="#ffffff">
<td>
<font size=+3>
<tt>
eof

 print文と、<<記号を用いて、HTMLの前半部分を一気に出力している。この場合、eofという文字列までの内容を全て出力することになる。
 最初にContent-type: text/htmlと改行を2回出力しなければ、HTMLとして解釈されないので注意が必要。それ以下の部分については、ごく一般的なHTMLの文である。

単語部分出力

foreach $chara (@char1){
        print "$chara<br>\n";
}

 foreach文で、配列変数@char1の要素を次々と変数$charaに代入しながらループさせ、1文字出力するごとに<br>を出力して改行させている。
 この方法であれば、どのようなブラウザでも確実に縦書き表示させることができる。

HTML後半部分出力

print <<"eof";
</tt>
</font>
</td>
</table>
<hr>
<h2><a href="http://ash.jp/">ashに戻る</a></h2>
</center>
</body></html>
eof

 前半と同様に、print文と<<記号で、HTMLの後半部分を出力している。

終了

exit;

 exit文でプログラムを終了する。

その他、注意事項

 このスクリプトは、ファイル内の単語が2バイト文字であることを前提にして動作している。すなわち、ファイル内の単語に1バイトの英数字などがあったり、文字コードがjisコードなどであった場合、誤動作することになる。本来ならコードをチェックする必要があるのだが、単語ファイルを作のがCGI設置者と同じであることや、プログラム自体が簡略化されることを考慮し、あえて手を抜いたカタチになっている。注意されたし。

 なお、このスクリプトは「はしもと@ASH」の制作したものである。
 もし、このページが何かの参考になったのなら、感謝のメールでも出してくれると幸いである。 なお、お礼はカタチのあるものでも一向に構わない(笑) 送り先はこちらの通り。

 では、また会う日まで。



Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp