- ファイルハンドル -
♣ファイルとは
ファイルハンドルとはファイルを操作するためのもの。
◆ファイルの種類
| テキストファイル | 人間が文字として読めるもの(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関数は指定した文字列を出力して強制終了する。
♣テキストファイルの読み込み
ファイルからデータを読み込む為には、呼び出したファイル名を<>でくくる。
◆読み込み専用の場合
<<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);
※ファイルの読み書き両用を扱う時には、書き出す前にファイルポジションを先頭に戻してから、 現在のファイルハンドルの長さ以降を切り詰める必要がある。