お正月に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」の制作したものである。
もし、このページが何かの参考になったのなら、感謝のメールでも出してくれると幸いである。
なお、お礼はカタチのあるものでも一向に構わない(笑) 送り先はこちらの通り。
では、また会う日まで。