Here's another,
open my $out, '>', 'ABC' or die $!;
{
local $_;
open my $A, '<', 'A' or die $!;
open my $B, '<', 'B' or die $!;
open my $C, '<', 'C' or die $!;
no warnings 'uninitialized';
while ($_ = <$A> . <$B> . <$C>) {
s/\n//g;
print $out $_, "\n";
}
}
close $out or warn $!;
That will let the files have different numbers of lines. Memory use is small, and independent of file size.
Update: Repaired the thinko blazar++ spotted. Empty lines are not a problem - we don't chomp, so they retain newlines until we s/// them gone. I like blazar's extension to different numbers of files.