あるファイルの内容を読み込んで、該当箇所を置換するようなプログラムを書いていました。例えばhtmlファイルの中に<-- body -->と書いておいて、別のファイルから読み込んでその中に埋め込むといったような、日記なんかを書くときに便利なスクリプトです。んで、例のごとくPerlで書いていたのですが、Perlの場合、ファイルを読むときって、普通に読むと一行ずつ読んでしまうんです。だから、一つの変数にいれてやると。
open(IN, $file) || die $!; $data = join('',<IN>);
っていう風にね。 でもどうしてもそれだと処理が遅くなる。ファイルの中身を一発で変数に入れる方法はないのだろうか。 んで、PHPで書いてみた。
<?php $data = file_get_contents($file); ?>
おいおい一行。しかもがっつり読み込むので高速。癪に障るのでPerlで別の方法を検討した。
open(IN, $file) || or die $!; $status = stat(IN); $result = read(IN, $data, $status[7]);
これは、ファイルのサイズを先に取得してからそのバイト数だけファイルを読み込むというテである。stat関数でいろいろ取れるのだが、添え字が7のものがファイルサイズであることを利用しています。
perlfaqの"How can I read in an entire file all at once?"により、以下の方法がよいことがわかった。open(IN, $file); $data = do{local $/ = undef; <IN>};