前節ではファイルのオープンとクローズについてお話しました。 この節では実際にファイルからデータを読み込んだり、データをファイルに書きこんだりするための方法をお話します。
まずはファイルからデータを読み込む方法について見て行きます。 でもこれは「§6.1 標準入力からの入力」で見たような、標準入力からデータを受け取る方法とほとんど同じです。 次の例は、ファイルをオープンして、その中のデータを全部読みこんで標準出力に出力するスクリプトです。
open(IN, "<hoge.dat");
@lines = <IN>;
close(IN);
foreach (@lines) {
print;
}
上のスクリプトの2行目では、第6章で紹介した行入力演算子を使って、hoge.datの中のデータを、改行文字までを区切りとして@lines配列に格納しています。 そして4行目以降のforeachループでファイルの中身を全て出力しているのです。 print関数は、上のように引数を省略すると特殊変数$_の中身を出力します。
また次のようにwhile文を使っても同じことが出来ます。
open(IN, "<hoge.dat");
while (<IN>) {
print;
}
close(IN);
行入力演算子は、その中のファイルハンドルで結び付けられたファイルから1行を読みこんで、読みこんだ行を返します。 そしてファイルの終わりになると偽を返します。 空行には改行文字があるので偽ではないことに注意してください。 また上のスクリプトの2行目のように、while文の条件式の中に<IN>とだけ書いてある場合、読みこんだ1行を特殊変数$_に代入します。
例として次のスクリプトを見てください。
while (<>) {
print;
}
このスクリプトをyomikaki.plという名前で保存して、次のようにして実行します。
perl yomikaki.pl test.txt
すると、test.txtの中身が表示されます。 これは、プロンプトからスクリプトに対して渡された引数(今の場合はtest.txt)が特殊配列@ARGVに格納され、行入力演算子はその要素を自動的に読みこんでいく仕組みになっているからです。 引数が何もなければ、標準入力から入力された物を読みこみます。
入力用にはこのほかにread関数があります。 read関数の構文は次のとおりです。
read(FH, $in, length);
read関数は、第1引数で受け取ったファイルハンドルで結び付けられたファイルから、第3引数で指定した長さのバイト数だけデータを読み込んで、その内容を第2引数のスカラー変数に格納します。 read関数はCGI等で、フォームから受けとったデータを読み込むときに使います。
ファイルへデータを出力するには、おなじみのprint関数を使います。 「§6.2 標準出力への出力」でも紹介しましたが、
print FH "hogehoge";
のように、出力する文字列の前にファイルハンドルを書くと、そのファイルハンドルによって結びついているファイルに出力します。 ファイルハンドルと文字列の間はコンマではなく空白文字であることに注意してください。 コンマを書いてしまうと、ファイルハンドルを文字列と勘違いして、それも出力してしまいます。
この節ではファイル入出力について紹介してきました。 次の節ではファイルオープンエラー処理についてお話します。