use strict; my @filenames = qw/one.txt two.txt three.txt/; my @filehandles; foreach my $filename (@filenames) { open my $fh, '<', $filename or die "Could not open $filename; $!"; push @filehandles, $fh; } ## end foreach my $filename (@filenames) while (1) { my $lines_ref = read_lines_parallel(@filehandles); last unless $lines_ref; print join '|', @$lines_ref; print '-' x 20, "\n"; } ## end while (1) sub read_lines_parallel { my @filehandles = @_; my @lines; foreach (@filehandles) { push @lines, scalar <$_>; } ## end foreach (@filehandles) if ( join '', @lines ) { return \@lines; } ## end if ( join '', @lines ) else { return undef; } ## end else [ if ( join '', @lines ) } ## end sub read_lines_parallel #### first line file 1 |line 1 file 2 |first line file 3 -------------------- second line file 1 |line 2 file 2 |second line file 3 -------------------- third line file 1 ||third line file 3 -------------------- ||fourth line file 3 -------------------- #### while (1) { my $lines_ref = read_lines_parallel(@filehandles); last unless $lines_ref; print join '|', @$lines_ref; print '-' x 20, "\n"; } #### while (my $lines_ref = read_lines_parallel(@filehandles)) { # Do something with $lines_ref or @$lines_ref here print join '|', @$lines_ref; print '-' x 20, "\n"; }