RubyCGI.org

RubyでCGIを作ろう


3章1節 日本語の変換と関数の作成 更新日付: [2002-05-17]



今回は日本語の変換と関数の作成を学びます。

今回は前に作った1行掲示板を修正した物を使います。まずはプログラムを見てみましょう。

-- プログラム 始まり -- test311.cgi

#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"
require "cgi-lib"
input = CGI.new

require "kconv"

#初期設定
FILENAME = "data311.log"
MAXLOG = 10
$log = []

##### 関数の作成 始まり #####
#ログファイルの読みこみ関数
def read_log_file
c = 0
fh = open(FILENAME)
fh.each{|l|
$log[c] = l
c += 1
if c >= MAXLOG
break
end
}
fh.close
end

#ログファイルの書き込み関数
def write_log_file(writedata)
$log.unshift("#{writedata}\n")
c = 0
fh = open(FILENAME, "w")
$log.each{|l|
fh.print l
c += 1
if c >= MAXLOG
break
end
}
fh.close
end
##### 関数の作成 終わり #####


#フォームからのデータ読みこみと日本語変換
senddata = Kconv.toeuc(input["senddata"]) if input["senddata"]

#ログファイルの読みこみ関数を呼び出す
read_log_file

#ログファイルの書き込み関数を呼び出す
if senddata
write_log_file(senddata)
end

#HTMLの表示
print <<EOF;
<html>
<body>
<form method="POST">
<input type="text" name="senddata" size="80">
<input type="submit" value="送信">
</form>
<hr>
EOF

$log.each{|l|
print "#{l}\n<hr>\n"
}

print <<EOF;
</body>
</html>
EOF

-- プログラム 終わり --


まず先にdata311.logというファイルを作成しておき、
test311.cgiとdata311.logをアップし、パーミッションの変更を行います。

実行してみると前に作った1行掲示板をまったく代わりがありません。
しかし、プログラムを見てみるとずいぶんと変わっている事に気が付きます。

プログラムの流れを追いながら解説します。

1行目から4行目はお決り文句です。
6行目のrequire "kconv"は日本語モジュールを呼び出す準備をしろ意味です。
このkconvは日本語変換を行うためのモジュールです。
現在、日本ではJIS、SJIS、EUCという3種類の文字コードが使われています。
歴史的な背景からWindowsではSJIS、UNIXではEUCを使う傾向が強く、
掲示板内ではこの文字コードを統一しないとうまく表示ができません。
このモジュールは後で呼び出します。

8〜11行目は初期設定なのですが11行目のlogの前に「$」が付いている事に注意して下さい。
これはグローバル変数といってこのプログラム内すべてで使える変数を設定しています。
これも後で説明します。

13〜42行目は関数の設定なのですがとりあえず読み飛ばしてください。

46行目は6行目で準備をしたkconvを呼び出しています。
フォームで受け取ったsenddataの内容を文字コードEUCに変換してsenddataに入れろという意味です。
Kconv.toeucでEUCに変換しています。
これをKconv.tosjisに変えるとSJISコードへの変換
Kconv.tojisへ変えるとJISコードへの変換となります。
ここではEUCの文字コードを使っています。これはUNIX上では一番問題が起こらない文字コードだからです。

49行目ではread_log_fileという関数(read_log_file)を呼び出しています。
(サブルーチンという呼び名をした方がわかりやすい人もいるかもしれません)
これの内容は14行から26行を見てください。(ここでさっき読み飛ばした内容が出てきました。)
read_log_fileという関数を呼び出したので
「def read_log_file」から「end」までの間で定義されていた関数を呼び出した事になります。
なお、これは今まで使っていたファイルの読み出し文をほぼそのまま使っています。
ちょっとだけ違うのはlogの前に「$」という文字が付いている事です。
関数の中では今まで使っていた普通の変数(これはローカル変数という)は使えなくなるのでプログラム内全体から使えるグローバル変数を使用します。
ちなみに今回はこの部分を関数にするメリットはとくにないのですが
プログラム内で同じ処理を行いたい場合にはこのように関数を作っておくと
同じ処理を何度も書かなくて済むというメリットがあります。

51行から54行ではsenddataがあったらファイルを書きこむ関数を呼び出しています。
ファイルの読み出しとちょっと違うのは「write_log_file(senddata)」と
関数の後に括弧が付いてその中にsenddataという変数が入っている事です。
プログラムのメインの流れから関数へ変数を渡すときにはこのようにします。
それを受け取り側の関数では「writedata」という名前をつけて受け取っています。

その後は1行掲示板で説明した物と同じになっていますのでとくに説明の必要はないですね。

プログラムで関数という物は多用されますのでしっかりと理解しましょう。


今回始めて使った命令など
Kconv
関数(privateメソッド)

RubyによるCGIプログラミング
RubyによるCGIプログラミング

<− 前へ : 3. 掲示板を作ります | 次へ : 3.2. 文字列の変換(正規表現) −>

RubyでCGIを作ろうトップ

| トップページ | 書籍「Ruby/GTKプログラミング入門」 | 書籍「RubyによるCGIプログラミング」 | RubyでCGIを作ろう | リンク集 | ツールなど | 自己紹介 |