4つのファイルがあるとすると、4つのファイルA B C D
を作成して、
ファイル1にが含まれB C D
、
ファイル2に含まれA C D
、
ファイル3に含まれA B D
、
ファイル4にが含まれるようにしますA B C
。
現在行っているのは、すべてのファイルを配列にロードし(文字列を使用するだけで少しメモリを節約できます)、各出力ファイルを連続して出力することです。
また、すべての出力ファイルを開いてから、各入力ファイルを順番に開いて、対応しないすべての出力ファイルに出力することもできます。これにより、常に1つのファイルのみがメモリに保持されます。
use strict; use warnings;
my @in = qw(A B C D);
my @out = qw(1 2 3 4);
my @outhandles = map {open my $fh, ">", $_ or die $!; $fh} @out;
for my $i (0 .. $#in) {
open my $fh, "<", $in[$i] or die $!;
my $content = do {local $/; <$fh>};
for my $j (0 .. $#outhandles) {
print {$outhandles[$j]} $content unless $i == $j;
}
}
print {$outhandles[$j]} $_ while <$fh>
入力ファイルを丸呑みする代わりに言うなら、メモリはさらに削減される可能性があります。
テスト
$ mkdir test; cd test;
$ for file in {A..D}; do echo $file >$file; done
$ perl ../script.pl
$ ls
1 2 3 4 A B C D
$ for file in `ls`; do echo == $file; cat $file; done
== 1
B
C
D
== 2
A
C
D
== 3
A
B
D
== 4
A
B
C
== A
A
== B
B
== C
C
== D
D