Perl入門   No.15


4.9 ファイル入出力
 
ファイルにデータを書き込んだり、読み出したりということは、データを保存したり、保存しているデータを読み出したりすることで、そのプログラム技術は必需品です。
 
標準入出力のところで、ファイルハンドルという言葉を説明しました。標準というのは、一般の入力装置であるキーボード、出力装置であるモニターのことを指します。その時に、<STDIN>とか<STDOUT>というハンドルを利用して入出力を行うということを説明しました。ファイルへの入出力は、このファイルハンドルを利用します。
することはすごく簡単なことで、ファイルハンドルを使って入出力先を切り替えるということです。
ただし、そのためには、ファイルとファイルハンドルを結びつける作業をしなければなりません。それをPerlでは、open()関数によって実現しています。
open( OUT ,"ファイル名");
 
こうすることによって「OUT」(必ず大文字。名前は適当に作ってよい。)というファイルハンドルとディスク上のファイルが結びつけられて、以降はこのファイルハンドルへの入出力ということになります。
 
読み出すには、先ほどのopen()に続けて、
read(OUT,$in_read,256);
 
とすると、変数 $in_read にファイルの先頭から256バイト読み込んだデータが格納されます。
 
ただし、これは文章が終わっていても改行コードを含んで指定の長さ分をまじめに読み取ります。これでは一行分を読んで処理を行いたいという場合には困ります。現実のファイルは、複数の行によって構成されていますので、ループ関数を使って一行ずつ最終行までを読み出すという作業がよく行われます。
open( OUT, "ファイル名");
while(<OUT>){
   print;
}
close(OUT);
 
このようにすることによって、一行ずつ読み込まれ、それを逐次モニターに出力されます。そしてそれが、ファイルの終端まで実行されます。今は一例としてモニターに出力する(print $_ と同じ)処理だけですが、ここで必要な様々な処理を書けばいいということになります。
 
そしてファイルをオープンしたら必ず閉じなければなりません。close(ファイルハンドル名)とします。この一文を忘れても、実際の処理は何事もなかったように行われますが、ファイルが壊れることがありますので、忘れないようすることが大事です。
 
例 ファイルを行番号付でモニターに表示する。
#!/usr/bin/perl

open(OUT,"ファイル名");
$line=1;
while(<OUT>){
   print $line." : ";
  print;
  $line++;
}
close(OUT);
 
ファイル名の所になにか適当なファイル名を入れて試してみてください。
 
次にファイルに書き込む方法です。これもファイルハンドルを利用します。
ファイル名は具体的に「test.txt」とします。
#!/usr/bin/perl

open(IN,">test.txt");
print IN "今日はよい天気です。\n";
close(IN);
 
そして先に作ったファイルの読み出すプログラムで読み出すファイル名を「test.txt」と書き換えて、無事書き出せているかどうか試してみてください。
 
この場合、「IN」というファイルハンドル名にしています。そして重要なのは、次の">ファイル名"という書き方です。これはリダイレクト処理(何か実行処理したものをファイルに書き込む)と同じですね。同様に">>ファイル名"とすると、追加書き込み(前のデータは消さずに尻に追加していく)ということになります。
 
print文は、丁寧に言うと、
pirnt ファイルハンドル名 内容
 
という書式になっています。ファイルハンドル名を省略すると標準出力先(モニター)に書き出します。ですから今は「IN」というファイルハンドルに書き出し、それはファイルと関係しているので、指定したファイルに書き出されるということになります。
 
 
先ほどのプログラムのopen()のところをこんなふうに書き換えて、何度か繰り返し実行してみましょう。そして同様にファイルを読み出してください。
open(IN,">>ファイル名");
 
どんなことになりましたか。