|
Perlではファイルを簡単に取り扱う事が出来ます。
改行コードで区切られたテキストファイルを読み書きするようなイメージです。
まず最初に、開いたファイルをファイルハンドルに関連付けします。
|
|
|
ファイルを開いた後はここで指定したファイルハンドルを使用してファイルの操作を行います。
ファイル名の前にはオープンモードを表わす記号を付けます。
オープンモードには色々ありますが以下の3つを知っておけば充分です。
open関数はオープンに成功すると真を、失敗すると偽を返します。
|
|
< 読み込み専用で開く。
> 書き込み専用で開く。
ファイルが既に存在する場合はファイルを空にする。
存在しない場合は新規作成される。
+< 読み書き両用で開く。
|
|
■読み込み専用オープン
ファイルの読み込みはファイル内容全てを一度に読み込む方法と1行(1レコード)ずつ読み込む方法とがあります。
|
|
$file = './logfile.log';
if (!open(IN, "<$file")) { &error("オープンエラー$!"); }
@data = <IN>;
close(IN);
|
|
ファイルを読み込み専用で開き、ファイル内容全てを配列@dataに読み込みます。
読み込みが終わった後はclose関数でファイルを閉じます。
オープンに失敗した時は引数と共に「errorサブルーチン」へ処理を移すようにしています。
引数の中に「$!」がありますが、この特殊変数にはエラーメッセージが自動的に格納される事になっています。
上記の書式は以下のように書き換える事も出来ます。
|
|
$file = './logfile.log';
open(IN, "<$file") || &error("オープンエラー$!");
@data = <IN>;
close(IN);
|
|
$file = './logfile.log';
open(IN, "<$file") || &error("オープンエラー$!");
while ($data = <IN>) { print "$data<br />"; }
close(IN);
|
|
while文を使用してファイルの終わりまで1行(1レコード)ずつ読み込んで表示します。
以下のように省略する事も出来ます。
|
|
$file = './logfile.log';
open(IN, "<$file") || &error("オープンエラー$!");
while (<IN>) { print "$_<br />"; }
close(IN);
|
|
|
while文の条件式部分をファイルハンドルだけにしています。
読み込まれたデータは$_(デフォルト変数)に1レコードずつ格納されます。
|
|
■書き込み専用オープン
ファイルを書き込み専用で開くとファイルが既に存在する場合は開いた時点でそのファイルを空にしてしまいます。
例えば掲示板のログファイルを更新する場合、今までのログファイルをあらかじめ全て配列に読み込んだ後に書き込み専用で開くようにしないと今までのログファイルは全て消滅してしまう事になります。
|
|
$file = './logfile.log';
open(OUT, ">$file") || &error("オープンエラー$!");
print OUT @data;
close(OUT);
|
|
|
ファイルに書き込むデータが全て配列@dataに入っているものとします。
ファイルを書き込み専用で開いた後、print関数を使用してファイルハンドルに対して書き込みを行います。
|
|
■読み書き両用オープン
「+<」を使用するとファイルを読み書き両用で開く事が出来ますが読み込み後、そのデータに何らかの処理をしてファイルに書き込む場合は、ファイルポインタが次の読み込み位置に移動したままなのでseek関数でファイルポインタをファイルの先頭に戻さなければなりません。
また、truncate関数でファイルを空にした後に書き込むようにするのが定石です。
これは元のデータよりも新しいデータのほうが少ない場合に「ごみ」が残ってしまうのを防ぐ為の措置です。
|
|
$file = './counter.log';
open(COUNT, "+<$file") || &error("オープンエラー$!");
$count = <COUNT>;
$count++;
seek(COUNT, 0, 0);
truncate(COUNT, 0);
print COUNT $count;
close(COUNT);
|
|
|
カウンタファイルを読み書き両用で開きファイルを$countに読み込みます。
そして$countに1を加算します。
ファイルポインタが次の読み込み位置に移動したままなのでseek関数でファイルポインタをファイルの先頭に戻します。
次にtruncate関数でファイルを空にした後、print関数でカウンタを書き込みます。
|
|
|
seek(ファイルハンドル, オフセット, 起点[0=先頭 1=現在位置 2=末尾]);
|
|
|
truncate(ファイルハンドル, ファイルサイズ);
|
|
■ファイルテスト演算子とstat関数
これらを使う事によってファイルやディレクトリの情報を得る事が出来ます。
|
|
|
□指定したファイルが存在すればファイル情報を表示する
|
|
$file = './data.log';
if (-e $file) {
print 'ファイルサイズ(バイト) = '.(stat(_))[7].'<br />';
print '最終更新時間(秒) = '.(stat(_))[9];
} else { print 'ファイルが存在しません。'; }
-e(ファイルテスト演算子)を使用して指定したファイルが存在するかどうかを調べ、存在する場合はstat関数を使用してファイルサイズと最終更新時間を表示しています。
|
|
-f ファイルが存在すれば真。
-e ファイルかフォルダが存在すれば真。
-s ファイルサイズが0でなければ真。
-d ディレクトリ(フォルダ)であれば真。
-l シンボリックリンクであれば真。
-z ファイルサイズが0であれば真。
-x 実行可能であれば真。
-T アスキーテキストファイルであれば真。
-w 書き込み可能であれば真。
-B バイナリファイルであれば真。
-r 読み込み可能であれば真。
|
|
(stat(_))[7] ファイルサイズ(バイト)。
(stat(_))[9] 最終更新時間(1970年1月1日0時0分0秒からの経過秒数)。
stat関数はファイルテスト演算子で直前にテストされたファイルやフォルダの情報を取得します。
|
|
□更新履歴
2007.04.24 全体的に内容を見直し
|
|
|