2.10.7. ファイル#

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

2.10.7.1. ファイルの読み込み#

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

以下の例では、sample.pdb ファイルを読み取りモード < で開き、ファイルハンドルを $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);

2.10.7.2. ファイルの書き込み#

ファイルへの書き込みを行う場合は、ファイルを書き込み(上書き)モード > または追記モード >> で開く必要があります。

書き込みモード > でファイルを開いた場合、ファイルが新しく作成されます。すでに同名のファイルが存在している場合は、その内容が破棄されるため注意が必要です。一方、追記モード >> でファイルを開くと、既存のファイルの末尾に内容を追加できます。ファイルが存在しない場合は、自動的に新規作成されます。

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

2.10.7.3. 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();

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

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;