perlでファイルの中身を全て読み込みたい時の方法

perlを使っている時に、ファイルの全ての内容を変数に格納したい時がある。例えば、こんな感じで。

my $data = read_file;

今回は、そんな方法を紹介していくよ。

ファイルの全ての内容を変数に格納する方法

結論から言うと、以下のように書けばファイルの中身を全て変数に格納できます。

sub read_file {
my $file = shift;
open my $fh, $file;
local $/;
my $data = <$fh>;
close $fh;
return $data;
}
my $file = 'sample.txt';
my $content = read_file($file);

肝心なのは、local $/;とすること。

perlでファイル操作をする時に「一行ごとに処理をする」等のコードを書くことがありますが、perl側が「一行」と言うのをどのように把握しているかと言うと、特殊変数$/に定義されている文字列を調べることで「一行」を把握しています。

(特殊文字とは、perl側があらかじめ用意している特別な変数のこと。$/変数は、デフォルトでは\n改行文字が格納されています。)

つまり、上記のコードではlocal $/;とすることで$/をundefにした上でmy $data = <$fh>;とすることで、ファイルの終わりまで読み込ませることができます。

公式ドキュメントの説明

以下は、公式ドキュメントの解説とリンクを掲載します。

入力レコードセパレータで、デフォルトでは改行文字。 これは Perl での「行」とは何か、ということに影響を与えます。 空文字列に設定されると、空行をセパレータとして扱うことを 含めて、awk の変数 RS のように働きます (空行はスペースやタブを含んでいてはいけません)。 複数文字の区切文字を示すために、文字列を設定することもできます; また、 ファイルの最後まで読み込むために undef を指定することもできます。 この変数に “\n\n” を設定すると、空行が続く場合において、 “” を設定した場合とわずかに違う動作をするようになります。 “” を設定した場合には、複数の空行も 1 つの空行であるかのように扱います。 “\n\n” を設定した場合には、単純に次の文字が (たとえ改行文字であっても) 次の段落に含まれるものとして扱います。

perlvar – Perl で定義済みの変数 – perldoc.jp

ReratedPosts

Mojoliciousを使う時のMojo::Base -baseとかの使い分けのまとめ
perlでファイルの読み込みとか作成とか削除のまとめ
Mojoliciousでディレクトリの場所を変数(属性)として格納する方法
perlのgrep関数の使い方|変数とか戻り値とか複数条件とかのまとめ
perlの$_[0](デフォルト引数)とか@_(引数リスト)について気になったので調べた
perlのコードでよく見かけるrequire、use、BEGINの役割や関係についてまとめる