***HPクリエイターのためのCGI講座 第30回***
6.1 ファイルの読み書き


ファイルを読み書きするには、ファイルにファイル・ハンドルを割り当てる必要があります。
ファイルハンドルは任意の名前を付けることができますが、唯一の規則として、すべての文字を大文字で記入しなければなりません。

ファイルにハンドルを割り当てることをファイルを開くと言います。
ファイルを開くにはopen関数を使用します。

モード 意味
読込み open(IN,"<file_name") file_nameを読込み用で開く    ファイル名の先頭に<を付ける
書込み open(OUT,">file_name") file_nameを書込み用で開く    ファイル名の先頭に>を付ける
読み書き両用 open(FILE,"+>file_name")
open(FILE,"+<file_name")
file_nameを読み書き両用で開く    ファイル名の先頭に+>または+<を付ける
左欄の両ステートメントは同じ意味

<ファイルを閉じる>
ファイルを閉じるにはcloseを使います。
しかし、Perlはプログラムの終了時にファイルを自動的にcloseします。
また、すでに開かれているファイルをopenしようとした場合でも、自動的にcloseしてからopenします。
したがってcloseは、ほとんどの場合必要はありませんが、高度なプログラムを作る場合、ファイルをcloseしなければならない事があります。
プログラムの読み易さから言っても、closeをする習慣を身に付けておいた方がいいでしょう。


<ファイルの入力>
ファイルの内容を読み出すには
   <ファイルハンドル>
を使います
=例=
open (IN,"<fname"); # ファイル名fnameを読み込みモードでオープン
$data=<IN>; #$dataへファイルから1行読み込む

配列を使うことで、ファイルのデータ全てを、一度に読み出すこともできます。
=例=
open (IN,"<fname"); # ファイル名fnameを読み込みモードでオープン
@data=<IN>; #@dataへファイルの内容を全て一度に読み込む
$data[0]に1行目
$data[1]に2行目
$data[2]に3行目
$data[3]に4行目
            :
            :
が読み込まれる

また、while を使えばファイルのデータを1行ずつ、ループで読み出していくことができます。
=例=
open (IN,"<fname"); # ファイル名fnameを読み込みモードでオープン
while(<IN>){ # $_ に1行のデータが読み込まれる
    print "$_"; # 読み込んだ1行データを出力
}
読み込む行(データ)がなくなれば <IN> はNULL(偽)を返します。
したがって、読み込む行が無くなれば、while ループから抜けます

<ファイルの出力>
ファイルへの書き込みは print を使います。
print はブラウザへ、HTMLテキストを送るために使用してきましたね。
今までは、ファイルハンドルの指定なしで print を使ってきました。
ファイルハンドルを指定しないと、 print は標準出力(CGIプログラムの場合はブラウザ)へデータを送ります。
今回のように、指定したファイルへデータを送りたい場合は、ファイルハンドルを明示します。
=例=
open (OUT,">fname"); # ファイル名fnameを書き込みモードでオープン
print OUT "File Data"; # ファイルへの書き込み


演習プログラムの虫食いのところを、色々変えて確認してみてください。


********************************************************************************
講師:ALK alk@arkland.co.jp
運営:アークランド(株) http://www.arkland.co.jp