Perlでファイルを読み込む

ITProが古い記事をおもむろに再掲したことに端を発する、今時のPerlの常識的なファイルの扱いが結構な反響を読んでいる様子。

Perlで調べ物をしていると古い情報に当たりやすいので、こういう今時の常識が広まるのはすごくありがたいです。Perl 5 今昔 - Perl-users.jpとかも素晴らしい。

弾さんのエントリでは、ファイルに関してはopenするところの扱いに絞って言及されていますが、もうちょっと広げてファイルの内容をまとめて変数に取り込む方法について備忘録的に書いてみます。


まず、普通にビルトイン関数で読み込み。Plaggerのソースからパクってきた形です。

open my $fh, '<', $filename or die("Cannot open file: $!");
my $data = join '', <$fh>;
close $fh;

closeではor die書いてないんですね。どうせdieしたらファイルハンドル閉じるからぉkってことなのか、closeでコケることは実際問題ないということなのか。

んで、IO::Fileを使うとこんな感じ(他にもいろいろ呼び出し方はあるけど、とりあえず)。

use IO::File;
my $fh = IO::File->new($filename, 'r') or die("Cannot open file: $!");
my $data = join '', $fh->getlines;
$fh->close or die("Cannot close file: $!");

…でいいのかな。

Perlベストプラクティス」には、ファイル全体を読み込まずに一行ずつ処理しろみたいに書いてあるけど、まぁケースバイケースなので。ちょっとした設定ファイルとか読む場合にはこれでいいやね。


あと、弾さんのエントリではuse fatalも紹介されてるけど、use fatalに関しては

でもこれはPerl::Critic 1.051の-severity=1では通らないので、今のところ使っていません。

という記述があったり、ググってもあまり引っかからなかったりであまり使われてないのかなぁという印象があります。実際の所どうなんだろ。