Whoops, that's what happens when you submit code without testing it first :). There were four things wrong with my code:
- The open call for the MIXED file did not have a '>'. This is sheer carelessness.
- I was openning the files to the same typeglob, which resulted in three references to the same open file being stored in the array. This is a more subtle bug.
- I was testing for eof after reading in a line, instead of before. This would result in the last line never being written to the mixed file.
- Finally, I was using 'last' within the inner loop, foolishly thinking it would get me out of the outer loop. Another dumb mistake.
Working code (at least on my Wintel box) follows:
my @files = ("1.txt", "2.txt", "3.txt");
my @fhs;
for ($i = 0; $i < scalar(@files); ++$i) {
open($fhs[$i], $files[$i]) || die;
}
open(MIXED, ">mixed.txt") || die;
OUTER:
while (1) {
foreach $fh (@fhs) {
last OUTER if (eof($fh));
$line = <$fh>;
print MIXED $line;
}
}
map { close($_); } @fhs;
close(MIXED);
Let this be a lesson for me in preliminary testing!
-ton