ファイルの取り扱い

Perl でファイルを取り扱うとき、基本的に以下の手順で行う。

  1. ファイルを開く
  2. 読み取り、書き込みなどの作業を行う
  3. ファイルを閉じる

ファイルの読み込み

ファイルを読み込みは while 文を利用して、1 行ずつ読み込む。ファイル全体を一度に読み込むことは可能だが、メモリーの関係上あまり好ましくない。

次は「sample.pdb」ファイルを 1 行ずつ読み込み、各行が「ATOM」で開始しているならば、その行を出力する例である。open 関数の 2 番目の引数が < となっている。これはファイルを読み込みモードで開くことを意味する。


# ファイルを開く。開けなかった場合プログラムを中止させ、原因を出力する
open(my $fh, '<', 'sample.pdb') or die 'Cannot open file: $!';

while (my $buff = <$fh>) {
  chomp($buff);              # 改行コードを削除
  if ($buff =~ /^ATOM/) {    # 行の先頭が ATOM であれば
    print $buff;               # その行を出力する
  }
}

ファイルの書き込み

open 関数を書き込みモード > で開くとき、そのファイルが存在しなければ新規作成される。また、そのファイルが存在すれば、内容を削除される。一方、追加書き込みモード >> を利用することで、ファイルが既に存在している場合、内容は削除されず、最終行から追加で書き込みが行われる。

open(my $fh, '>', "filename.txt") or die "Can't open file: $!";

# ファイル書き込みの処理
print $fh "Hello,\n"; 
print $fh "World.\n";

close($fh);

複数のファイルにデータを書き込む場合は、複数のファイルを書き込みモードで開けばよい。

my $data = [];    #ファイルに書き込むデータ
$data->[0]->{key} = 'cds';
$data->[0]->{seq} = 'accacgcagtcatgctatcgtcagt';
$data->[1]->{key} = 'rna';
$data->[1]->{seq} = 'accacgcacactttcattttctatcagt';

open(my $cdsfh, '>', './CDS.txt') or die;
open(my $rnafh, '>', './RNA.txt') or die;

for (my $i = 0; $i < @{$data}; $i++) {
  if ($data->[$i]->{key} eq 'cds') {
    print $cdsfh $data->[$i]->{seq};
  } else {
    print $rnafh $data->[$i]->{seq};
  }
}

close($cdsfh);
close($rnafh);