お正月にASHのページに来ていただいた方ならご覧になったことがあると思うが、5、7、5のランダムテキストを縦書きするCGIがある。動作しているものはこちら。perlのソースはこれ。
このCGIはASHオリジナルなものなのだが、今回は、PerlによるCGIの説明もかねて、このプログラムの簡単な解説をしてみよう。
このプログラムのおおまかな動作としては、5文字と7文字(文字数はバラバラだが)の単語データが格納されたファイルがあり、それから5文字データ、7文字データを読み込み、それらからランダムで単語を抽出、整形して表示するというわけだ。
ここでは、5文字データを1つだけ表示するように簡略化したソースを使って、解説しようと思う。実際のプログラムは各処理を3回ずつ繰り返しているだけなのだから。で、簡略化したソースはこれ。動作させるとこんな感じである。
ちなみに単語の入ったファイルはこんな感じである。1行に1つづつ単語が書かれているだけのテキストファイルである。
|
#!/usr/local/bin/perlで、perlのパスを指定し、このスクリプトをperlインタープリタで実行するように指定する。
また、データファイルのファイル名を変数$fivesに代入している。
################ # メイン処理 # # データ読み込み(5) |
外部ファイル(変数$fivesで表されたファイル、実際はfive.txt)を開き、配列変数@fiveにその内容を読み込む。
Perlでは、改行コードごとにデータは区切られ、配列の各要素には、five.txt内の単語が格納される。
# 乱数発生&単語確定 |
関数randで0から配列変数@fiveの要素数までの乱数を発生させ、関数intで小数点以下を切り捨て、変数$num1にその値を代入する。配列変数@fiveをスカラーコンテキストで評価する(よーするに、配列じゃなく、1次元的な要求をする…?)と、配列の要素数を返すので、それを利用しているのだ。
そして、配列変数@fiveの変数$num1番目の要素(最初の要素は0番めとなる)を変数$word1に代入する。(配列変数@arrayの各要素を使う場合は、@arrayではなく$array[0]や$array[1]という記述になる)
さらに、chomp関数で改行コードを切り捨てている。(chomp関数はperl5の関数、より賢いchop関数である)
# 文字をバラバラにする |
縦書きで表示するために、単語を文字ごとにバラバラにしている。変数$word1の長さを2で割った数(変数$word1の内容は2バイト文字なので、その値は変数$word1の文字数に等しい)を、変数$chaに代入。
for文で変数$cha回ループさせ、substr関数によって変数$wordの内容を2バイトずつ(1文字ずつ)配列変数@char1に代入している。
# 表示開始 |
print文と、<<記号を用いて、HTMLの前半部分を一気に出力している。この場合、eofという文字列までの内容を全て出力することになる。
最初にContent-type: text/htmlと改行を2回出力しなければ、HTMLとして解釈されないので注意が必要。それ以下の部分については、ごく一般的なHTMLの文である。
|
foreach文で、配列変数@char1の要素を次々と変数$charaに代入しながらループさせ、1文字出力するごとに<br>を出力して改行させている。
この方法であれば、どのようなブラウザでも確実に縦書き表示させることができる。
|
前半と同様に、print文と<<記号で、HTMLの後半部分を出力している。
|
exit文でプログラムを終了する。
このスクリプトは、ファイル内の単語が2バイト文字であることを前提にして動作している。すなわち、ファイル内の単語に1バイトの英数字などがあったり、文字コードがjisコードなどであった場合、誤動作することになる。本来ならコードをチェックする必要があるのだが、単語ファイルを作のがCGI設置者と同じであることや、プログラム自体が簡略化されることを考慮し、あえて手を抜いたカタチになっている。注意されたし。
なお、このスクリプトは「はしもと@ASH」の制作したものである。
もし、このページが何かの参考になったのなら、感謝のメールでも出してくれると幸いである。
なお、お礼はカタチのあるものでも一向に構わない(笑) 送り先はこちらの通り。
では、また会う日まで。