Perl初歩の初歩

プログラミング言語Perlの初心者のためのわかりやすい解説ブログ(を目指しています)

open 歴史を残さなければ

2009-09-07 11:41:13 | 命令を覚えよう

プログラムを実行した結果を記録したい場合があります。また、すでに記録しているデータをプログラムに読み込ませて実行したい場合もあります。

たとえば、アクセスカウンターでは、まず前回までのアクセス数を読み込んで、それに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);

とすればいいでしょう。