カウンタや掲示板などのCGIを作るときに、カウンター値やメッセージログを別のファイルに保存しておく必要がありますね。 その他のPerlスクリプトを作るときにも、ファイルからデータを読み込んだり、ファイルに書きこんだりする操作は必ず必要になってきます。 そこでこの章では、Perlでファイルを扱うための基本的な方法を紹介していきます。
「§6.1 標準入力からの入力」で、ファイルハンドルとは「スクリプトとファイルを結びつける物」と説明しましたが、もう少し詳しく言うと、「ファイルやデバイスにつけた名前のことで、そのうちのどれをさすかを指定するためのもの」となります。 ファイルハンドルは変数名やキーワードとは別の場所で管理されるので、ファイルハンドルには任意の文字を使うことが出来ます。 ただし、今後定義される可能性のある予約語(関数名など)とぶつからないようにするために、ファイルハンドルは全て大文字で書くように推奨されています。 また複数のファイルに同じファイルハンドルを使うこともできます。
ファイルにデータを書きこんだりする際にはまずファイルを開かなくてはなりません。 そのためにはopen関数を使います。
open(IN, "hoge.dat");
open関数はファイルハンドルとファイル名を受け取ります。 今の場合INがファイルハンドルです。 ファイル名がダブルクォートで囲まれていることに注意してください。 またファイル名の部分には、実際のファイル名を格納したスカラー変数を入れることも出来ます。 上のコードによって、カレントディレクトリにあるhoge.datというファイルがINというファイルハンドルと結びついて、読みこみ用でオープンされます。 読みこみ用でオープンするには、次のようにファイル名の前に<をつける方法もあります。
open(IN, "<hoge.dat");
また、ファイルを上書きモードでオープンするには、
open(OUT, ">hoge.dat");
のように、ファイル名の前に>をつけます。 上書きモードでオープンすると、そのファイルの先頭から書きこみをはじめます。 既存のファイルを開いた場合には前のデータは消去され、もし存在しないファイルを書きこみ用でオープンしようとした場合には、そのファイルが作成されます。
また、追加書きこみモードでファイルをオープンするには、ファイル名の前に>>をつけます。
open(ADD, ">>hoge.dat");
追加書きこみモードでオープンすると、ファイルの末尾に書きこみます。 またこの場合も存在しないファイルをオープンしようとすると、そのファイルが作成されます。
さらに、読み書き両用でオープンするには、次のどちらかを使います。 どちらを使っても動作に違いはないようです。
open(INOUT, "+<hoge.dat");
open(INOUT, "+>hoge.dat");
ファイルへの読みこみや書きこみが終わったらファイルをクローズします。 ファイルクローズにはclose関数を使います(なんとも単純ですね)。
close(IN);
close関数はファイルハンドルを受け取って、そのファイルハンドルが結び付けられているファイルをクローズします。 上のコードによって、先ほど読みこみ用でオープンしたhoge.datがクローズされます。 以前にオープンしたファイルをもう1度オープンした場合や、スクリプトの終了時には、開いているファイルは全てクローズされるので、あえてクローズしなくてもエラーにはなりませんが、スクリプトをわかりやすくするためにも、オープンしたファイルはクローズする習慣をつけておいたほうがいいでしょう。
この節ではファイルのオープンとクローズについてお話しました。 次の節では、実際にファイルを読みこんだり、ファイルに書きこんだりする操作についてお話します。