Variables.

●変数(1998/6/22)

もう少し言語らしい所に踏み込んでいきましょうか。お題は変数。カウンタを作るという建前で変数について触れていきましょう。カウンタは通常カウント数を記録するテキストファイルを用意しておくことで実現します。例えば1234等と書かれたテキストファイルを用意しておき、ページが参照されたときにこのファイルを読み込み、1を足してまたファイルに書き戻し、表示するという具合です。変数だけではなくファイルも扱うことになりますね。

まずは変数について早速。下の内容を見て下さい。

# リードオープンしてカウントを読み込み
open( COUNT, './count.txt' );
$count = <COUNT>;
close( COUNT );

# インクリメント
$count++;

# ライトオープンしてカウントを書き込み
open( COUNT, '>./count.txt' );
print COUNT "$count";
close( COUNT );

# カウントを出力
print "現在のカウントは$countです\n";

まだホームページ上で使える形になっていませんが、telnet上で実行は可能な内容です。ファイル名は例えばcounter.cgi等としてください。実行する前に予めテキストファイルを用意しておく必要があります。ファイル名はcount.txtで、permissiond rw- --- rw-counter.cgiと同じディレクトリに置いて下さい。counter.cgipermissionもお忘れなく。準備が整ったら早速実行してみましょう。どうでしょうか。

現在のカウントは1です

こんな感じで表示されたらうまくいってます。さてプログラムの内容について説明しましょう。キーワードを見ておおよそ見当が付いた方も多いことでしょう。特にC/C++言語をご存じの方は馴染みのある内容ではないでしょうか。各行の最後はセミコロンになっています(コメント行や空白行は除く)。このセミコロンは必ず必要です。セミコロンが1つの行の終わりを意味します。必ず最後に付けるようにしましょう。

まず一番最初の行にある、openというキーワード。これがカウント数が書かれているテキストファイル(ここではcount.txtのこと)の読み込むための準備をしています。開くという意味ですが文字通りでして、count.txtを開いています。どんな言語でもそうなのですが、プログラムからファイルをあれこれと操作するためには前もってオープンという操作が必要です。ファイルのオープンという操作を行うことで、以降そのファイルを扱えるようになります。

open( ファイルハンドル, ファイル名 )

openは括弧で括って、その中に2つのモノを指定してやります。2つのモノの間はカンマで区切ります。括弧の中のうち、カンマで区切られた後ろの方はおそらくすぐに判りますよね。これがオープンしたいファイル名です。例では./という指定が付いていますが、これは現在のディレクトリを表します。判らないのはファイルハンドルの方でしょう。プログラムが操作できるファイルは別に1つというわけではありません。必要なら10個でも20個でもファイルを操作できます。ですが仮に2つのファイルをオープンしている時に、「このファイル」から読み込みたい、という時にそれをどのようにしてperlに伝えれば良いでしょうか? これがファイルハンドルの存在意義です。openが正常に実行されると、上の例で言えばCOUNTcount.txtファイルハンドルが格納されます。これ以降は「このファイル」ではなくファイルハンドルを指定することでファイル操作を行います。

ファイル操作が終わったらオープンの逆で今度はクローズを行います。クローズすることでファイルの使用終了をperlに伝えます。忘れずにクローズするようにしましょう。closeopen同様に括弧で括ってファイルハンドルを指定します。

さて、次の行を見ると$countというのが出てきます。コレが変数です。見分けるのは簡単、先頭に$がついていたらそれは変数です。変数とは123等のような数値、abcdef等のような文字を記憶するモノです。変数にはプログラムを書く人や、逆に読む人が判りやすいように自由に名前を付けられます。今の例では名前はcountです。名前には英数文字が使えます。日本語は使えません。英数文字の他にもアンダースコアも使えます。

$count = 1;

これは変数$count1を記憶させています。このように記憶させることを代入する、という言い方をします。代入するときには変数名を書いて、その後に等号記号、続けて代入したいモノを書きます。等号記号が代入を意味します。

肝心のプログラムの方ですが、ここでも代入を行っているように見えます。実際、代入を行っているのですが代入しているモノが何なのか判りますでしょうか? <COUNT>なるモノを代入しています。COUNTopenを実行することによってファイルハンドルが格納されています。つまりcount.txtというファイルを指定していることになるので、これはファイルcount.txtから中身を読みとって、それを変数$countに代入することになります。つまりカウント値を$countに代入しているのですね。注目すべきなのはファイルハンドル<>で括っている所です。これを忘れると全然違う結果になってしまいます。ですが、openの所では<>がありません。この<>は指定しているファイルハンドルでファイルの中身を読み込むことを意味しています。単にCOUNTと書けば、それはファイルハンドルCOUNTを意味しています。<COUNT>と書いた場合はファイルハンドルCOUNTで指定したファイルの中身を読み込みます。

念のため補足しておくと、初回実行時はファイルの中身が空っぽですのでその時には0が代入されます。

これでプログラムがカウント値を知りました。次にするのは1を足すという処理です。変数の内容を増減させる方法としては以下のような方法があります。

$count = $count + 1;

変数$countの内容に1を足したモノを、また変数$countに代入しています。判りますよね? +10でも-100でも自由に書くことが出来ます。この辺の書き方は、学校で習った数学(算数?)と全く同じです。ただ、等号記号の左辺と右辺の両方に同じ$countがあるのが多少違和感があるかもしれません。でも、これはプログラミングの世界では常套手段ですので覚えておきましょう。少し例を挙げておきましょうか。

$abc = $def * 3; # $def3倍したモノを$abcに代入
$abc = $def / 10; # $def10で割ったモノを$abcに代入
$abc = $def * ( $ghi - 5 ); # $ghiから5を引いたモノを$defに掛けて$abcに代入

これだけあれば充分でしょう。*は掛け算、/は割り算に使用する記号です。

さてさて、それではプログラムにある$count++というのは何を意味するのでしょうか? +記号が2つ続いています。コメントにインクリメントと書いてありますが、これは$count1を足しています。ただそれだけです。やっていることは$count = $count + 1と何ら違いはありません。1を足す、という時には代わりに++という風にプラス記号を2つ続ければOKです。同様にマイナス記号を2つ続ければ1を引くことになります。コメントにあるインクリメント(increment:増加)と書いてある意味が判りましたでしょうか。減らすときはデクリメント(decrement:減少)と言います。

カウンタアップもこれで終わり。今度は元のテキストファイルにインクリメント後のカウント値を書き戻す処理です。ファイル操作を行うのですから当然ファイルをオープンしなければいけません。プログラムのopenの箇所を見てみましょう。

open( COUNT, '>./count.txt' );

カウント値を読み込むためにオープンしたときと殆ど同じですが、唯一ファイル名のところだけが違っています。ファイル名の前に>が付いていますね。実はこの>記号が書き込みをするためにファイルをオープンすることを意味しています。逆に言うと、最初のopenでは>記号を指定していなかったので、読み込みのためにオープンしたことになります。読み込みのためにオープンした場合は書き込みが出来ません。逆に、書き込みのためにオープンした場合は読み込みをしても期待した結果にはなりません。

ファイル名の前に>記号を付けて書き込みオープンをしたので、今度はカウント値をそのファイルに書き込みます。書き込みにはprintを使います。え? と思った方もいらっしゃるかもしれません。でもprintでファイルに書き込みを行うんです。

print ファイルハンドル 出力内容

もう判ると思いますが、ファイルハンドルにはここではCOUNTを指定します。出力内容は判りますよね? ファイルに書き込みたいモノを指定します。すると、ファイルハンドルで指定したファイルに出力内容で指定したモノが書き込まれます。例では出力内容を"で括って、その中に$countという風に変数を書いています。printが実行されるときには$countとファイルに書き込まれるわけではなく、変数$countの内容が書き込まれます。この辺がC/C++のような言語と違って楽です。C/C++では$countと書いたら本当にそのまんま$countとファイルに書き込まれてしまいます。

で、printファイルハンドルを指定するわけですが、実はこのファイルハンドルは省略が許されています。省略した場合にprintが何処に書き込みを行うかというと、これがこのページで前々から言ってきた標準出力なのです(以前のトピックで既に説明済みですよね)標準出力に書き込みを行うと、それは画面に表示されることになります。

書き込みが終わったのでクローズします。最後にprintを使ってインクリメント後のカウント値を表示(ファイルハンドルを省略しているので標準出力に書き込み)させています。

このトピックで取り上げたスクリプトはココからダウンロード出来ます。圧縮してあるので適当なディレクトリに解凍してください。


戻る