プログラムを実行した結果を記録したい場合があります。また、すでに記録しているデータをプログラムに読み込ませて実行したい場合もあります。
たとえば、アクセスカウンターでは、まず前回までのアクセス数を読み込んで、それに1を足してものを新しいアクセス数として記録しているわけです。
データを読み込んだり、記録したりするのに、Perlでは open という命令を使います。
open(DAT, "counter.txt");
$count = <DAT>;
close(DAT);print $count;
上記のプログラムは、counter.txt というファイルの1行目のデータを読み込んで表示しています。
open(ファイルハンドル, ファイル名) という形式で、読み込むファイルを指定します。
close(ファイルハンドル) という形式で、ファイルの指定を解除します。
ファイルハンドルとは、ファイルそのものを記号化したもので、ざっくり言ってしまえばファイル専用の変数のことです。特殊な変数なので、先頭に $ はつけません。
ファイルハンドルは自分で自由に命名して構いませんが、慣例として英字の大文字を使用しています。
FH とか FILE とか IN とか OUT などが多く使われているようです。ここでは DAT と名付けました。
<DAT> は ファイルからデータを読み込むときに使います。
上の場合、counter.txt の 1行目を読み込んで $count に入れています。
1行とは、「前回読み込み終わった直後」から、「次の改行記号の直後」までです。
つまり改行記号が(あれば)含まれます。
もし次の改行記号が見つからなければ、ファイルの最後まで読み込みます。
上の場合なら、open で 開いたすぐあとに <DAT> を使っているので、ファイルの先頭から1行を読み込んで、$count に入れているわけです。
次のような使い方もできます。
open(DAT, "data.txt");
$line1 = <DAT>;
$line2 = <DAT>;
close(DAT);
上の場合、$line1 には1行目が、$line2 には2行目が入ります。
したがって、ファイルを1行ずつ処理したい場合には、while を使って次のようにします。
open(DAT, "data.txt");
while ($line = <DAT>) {
print $line;
}
close(DAT);
$line = <DAT> で 1行ずつ読み込んで表示します。
もし、読み込むべきデータが無くなったら while を抜けます。
ファイルの全部をいっぺんに読み込みたい場合には、
open(DAT, "data.txt");
@allbody = <DAT>;
close(DAT);
とします。
これは、ファイルの全部を1行ずつに分割して、配列に入れます。
もし、配列ではなくひとつの文字列としたいなら、上記の後に
$all = join('', @allbody);
とすればいいでしょう。