PerlならサンプルコードPerl入門

2008-07-23

すべての行をスカラ変数に読み込む すべての行を配列に読み込む

  1. Perl
  2. ファイル入出力

 Perlでは、面倒な記述なしで、ファイルの内容すべてをスカラ変数に読み込んだり、すべての行を配列に読み込んだりできます。

 以下は、ファイルのすべての内容を一度にスカラ変数に読み込むサンプルです。

use strict;
use warnings;

# 読み込みたいファイル名
my $file = shift; 

print "1: ファイルのすべての内容を一度に読み込む\n";
open(my $fh, "<", $file)
  or die "Cannot open $file: $!";

my $all_lines;
{
  # 読み込む際のレコードセパレータをundefにすると
  # ファイルのすべての内容を一度に読み取ることができます。
  local $/ = undef; 
                      
  $all_lines = readline $fh;
}

print $all_lines;
close $fh;

 以下は、すべての行を配列に読み込むサンプルです。

use strict;
use warnings;

# 読み込みたいファイル名
my $file = shift; 

print "2: すべての行を配列に読み込む。\n";
open(my $fh, "<", $file)
  or die "Cannot open $file: $!";

# 左辺を配列にし、リストコンテキストで
# 読み込むとすべての行が@all_lines に代入
# されます。
my @all_lines = readline $fh; 
print foreach @all_lines;
close $fh;

コード解説

(1)ファイルのすべての内容を読み込んでスカラ変数に代入する
my $all_lines;

{
  local $/ = undef; 
  $all_lines = readline $fh;
}

 readline関数が一度に読み取るのは、$/ に設定されている文字が出現するまでです。$/は、インプットレコードセパレータといい、デフォルトでは \n 、改行文字が設定されています。

 ファイルのすべての内容を一度に読み取るには、$/ を、undefを代入して未定義にし、readline関数を呼び出します。

 $/の変更は、全体に影響を及ぼすので、{ local $/ = undef } という記述で一時的に変更しています。

(2)すべての行を配列に読み込む
my @all_lines = readline $fh; 

 すべての行を配列に読み込むには、左辺を配列にして、リストコンテキストでreadline関数を呼び出します。

(3)一度に読み込む場合の注意点

 ひとつのスカラ変数に読み込む方法も、配列に読み込む方法も、ファイルのすべての内容をメモリに読み込むことになります。メモリ上で処理できるので処理速度は向上しますが、たくさんのメモリを使用することになります。

 メモリ容量にもよりますが、ファイルの内容が膨大な場合(たとえば数百メガバイト)の場合は、メモリ上に一度に読み込むと、スラッシングが発生して処理速度は最低になります。大容量のファイルを処理する場合は、一行ずつ処理するようにします。