Perl でファイルの読み書きを行う方法

ファイルの取り扱い

Perl でファイルの読み書きを行うときは、ファイルを開き、ファイルの読み書きを行うファイルハンドルを変数に保存してから、その変数を利用して読み書きなどの作業を行う。

ファイルの読み込み

Perl でファイルの読み込むを行うとき、ファイルを読み取りモードで開いで、while 文を利用して 1 行ずつ読み込む。ファイルが存在しないなどの場合は、処理を異常中断させるために、die コマンドも合わせて利用するのが一般的である。

sample.pdf ファイルを読み取りモード < で開き、ファイルハンドルを $fh に保存する。

open(my $fh, '<', './sample.pdb') or die 'Cannot open file: $!';

次に、ファイルハンドルを while 文で繰り返しながら 1 行ずつ読み取りを行う。

while (my $buff = <$fh>) {
  chomp($buff);
  if ($buff =~ /^ATOM/) {
    print $buff;
  }
}

すべての処理を終えてから、ファイルを閉じる。

close($fh);

ファイルの書き込み

ファイルの書き込みは、ファイルを書き込みモード > または上書きモード >> で開く必要がある。

書き込みモードでファイルが開く場合、ファイルが新しく作成される。すでにファイルが存在している場合は、そのファイルは破棄される。注意が必要である。

上書きモードでファイルを開く場合は、既存のファイルの下に内容を追加することができる。ファイルが存在しなければ、自動的に新規作成される。

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);

gzip 圧縮ファイルの読み書き

バイオインフォマティックスの分野において、gzip 形式で圧縮されたファイルを取り扱う場合が多い。Perl を利用して、gzip 形式で圧縮されたファイルを読み込んだり、書き出したりする際に、Compress:Zlib などのライブラリーを利用すると便利である。

ファイルの読み込みは、open の代わりに gzopen を用いてバイナリー読み取りモードでファイルを開き、各行のデータを gzreadline メソッドで読み取る。

use Compress::Zlib;

my $fh = gzopen("sample.fa.gz", "rb") or die "File not found.";

while(($data_size= $fh->gzreadline($buff)) > 0) {
    print($buff)
}

$fh->gzclose();

ファイルの書き込みは、gzopen を利用してファイルをバイナリー書き込みモードで開き、gzwrite メソッドでデータの書き込みを行う。

use Compress::Zlib;

my $fh = gzopen("output.fa.gz", "wb") or die "Could not create file.";

$fh->gzwrite(">Seq1\nGCTGATCGAGTCGATCGATGCAGCTAGGT\n");
$fh->gzwrite(">Seq2\nTCGATTATATGCTAGTCGATGCTTTCGATGCGC\n");
$fh->gzwrite(">Seq3\nGCTGAATCGCTATTATATGCATGCATGTCTGCAGCTAGGC\n");

$fh->gzclose();

ファイルのパーミッション変更

Perl は、ファイルのパーミッション変更を行う chmod 関数が用意されている。ファイルのパーミッションを変更したい場合、chmod 関数の後にパーミション、その後ろにファイルの名前を入れて実行すればよい。

例えば、1 つのファイルだけに対してパーミション変更を行う場合は、次のようにする。

my $file = './sample.pdb';
chmod 0764, $file or die "Cannot change permishion $file";;

ファイルが複数でもよい。

my $file1 = './sample.pdb';
my $file2 = './sample.fa'
chmod 0764, $file1, $file2;

ファイルが複数の場合は、一度配列に代入して、chmod に配列を代入しても良い。

my @files = ('./sample.pdb', './sample.fa');
chmod 0764, @files;