use constant UNPACKER => 'A24 A*'; open IN, '<', \$file1; while () { # my ($key, $tail) = m/(.{24})(.*)/; # my ($key, $tail) = unpack('A24 A*', $_); # my ($key, $tail) = unpacker(); my ($key, $tail) = unpack(UNPACKER, $_); push @{$f1Lines{$key}}, [$tail, $.]; } close IN; open IN, '<', \$file2; while () { # my ($key, $tail) = m/(.{24})(.*)/; # my ($key, $tail) = unpack('A24 A*', $_); # my ($key, $tail) = unpacker(); my ($key, $tail) = unpack(UNPACKER, $_); next unless exists $f1Lines{$key}; my @matches = @{$f1Lines{$key}}; print "Line $. of file2 ($key$tail) matches:\n"; print " line $_->[1] of file1 ($key$_->[0])\n" for @matches; } close IN; sub unpacker { unpack('A24 A*', $_) }