- ファイルハンドル -

Perlとは

ファイルハンドルとはファイルを操作するためのもの。

◆ファイルの種類

テキストファイル 人間が文字として読めるもの(perlやHTMLのソースファイルなど)
バイナリファイル 人間が文字として読めないもの(画像ファイルや音声ファイル)

◆ファイルの処理

@ファイルを開く open関数 open(FILE, ">>memo.txt");
A処理を行う    
Bファイルを閉じる close関数 close(FILE);

◆モード指定

< 読み込み専用 ファイルの先頭から読み込む
> 書き出し専用 新規にファイルを作成。前のファイルはなくなる。上書き保存
>> 追加書き出し ファイルの末尾から書き出す。別名保存
+> 読み書き両用 flock関数を使用した場合データの破損がしにくい利点がある
+< 読み書き両用  
command | パイプ処理 command を実行し、その出力をパイプ経由でファイルハンドルを渡す
| command パイプ処理 出力とファイルハンドルをパイプで command に渡す

※あるプログラムの出力を、別のプログラムに入力する機能を「パイプ」といい、|をつける事によりパイプ処理になる。

読み込むファイルがない、権限がない、などの理由でオープンに失敗すると、open関数はundefを返します。 失敗した場合にプログラムを強制終了する為にdie関数を使う。


open(FILE, ">>memo.txt") || die "File Open Error!\n";

※die関数は指定した文字列を出力して強制終了する。

サンプル Perlとは

ファイルからデータを読み込む為には、呼び出したファイル名を<>でくくる。


◆読み込み専用の場合

<<samp.txt>> 今日はとっても暑い日ですね。 明日も晴れるみたい。 雨が降るといいですね。 <<sa.pl>> open(FILE, "<samp2p.txt") || die "File Open Error!\n"; $a = <FILE>; $b = <FILE>; @list= <FILE>; #すべてのデータを配列に読み込む事が出来る。 print $a,$b; print $list[0]; #但し、上記で変数aとbに2行文代入してしまっているので、         残りの「雨が降るといいですね。」部分だけが配列に入っている事になる。 close(FILE); -------------------------------------- <<結果>> 今日はとっても暑い日ですね。 明日も晴れるみたい。 雨が降るといいですね。

◆書き込み専用の場合

<<sa.pl>> open(FILE, ">samp.txt") || die "File Open Error!\n"; print FILE "書き込まれていますか?"; close(FILE); -------------------------------------- <<結果>> 書き込まれていますか? #samp.txtに書かれていた内容はクリアされ、             「書き込まれていますか?」が書き込まれてしまう。

◆追加書き込み専用の場合

open(FILE, ">>samp.txt") || die "File Open Error!\n"; print FILE "楽しい楽しい幼稚園〜"; close(FILE); -------------------------------------- <<結果>> 書き込まれていますか?楽しい楽しい幼稚園〜

※読み込むデータが1行の場合は$変数を、複数の場合は@配列を指定する

◆読みこみ専用の場合でバイトを指定して読み込む

ファイルから指定したバイト数分のデータを読み込む場合には、read関数を使う。


open(FILE, "<samp.txt") || die "File Open Error!\n";

read(FILE, $a, 5); #読み込んだデータを格納する変数, 読み込むバイト数 となる
print $a;

close(FILE);


◆読み書き両用

通常で使用すると、読み込まれたデータは、元のデータの末尾に追加されてしまう。 元のデータに上書きで保存したい場合には、seek関数を使う。

seek(ファイルハンドル, オフセット, 起点)


seek(***, 0, 0); #0,0でファイルの先頭に書き込み位置を移動させられる。

※0.0ファイルの先頭、0.1現在のファイルポインタ、0.2ファイルの末尾

◆データサイズの変更

runcate 関数を使うと、ファイルサイズを変更することが出来る。 ファイルサイズを0に切り詰め、新にデータを書き込みたいときなどに使用する。


truncate(ファイルハンドル名, tell(ファイルハンドル名));
#データの後ろにいらない改行やデータをすべて捨てる必要がある

--------------------------------------------------

open(FILE, "+<count.dat") || die "File Open Error!\n";
	seek(FILE, 0, 0);
	truncate (FILE, 0); #データを空にする
close(FILE);

※ファイルの読み書き両用を扱う時には、書き出す前にファイルポジションを先頭に戻してから、 現在のファイルハンドルの長さ以降を切り詰める必要がある。