use strict; use warnings; my @FILES; open $FILES[0], '<', 'file1' or die; open $FILES[1], '<', 'file2' or die; my @w = map scalar <$_>, @FILES; my $empty = "blank line\n"; my %map = ( -1 => [ 0 ], 1 => [ 1 ], 0 => [ 0, 1 ], ); while (defined $w[0] && defined $w[1]) { my $cmp = $w[0] cmp $w[1]; print $cmp ? $empty : $w[0]; @w[ @{$map{$cmp}} ] = map scalar <$_>, @FILES[ @{$map{$cmp}} ]; } # Leftover lines in either file? print map $empty, map <$_>, @FILES;