in reply to hash jerkin

Here is another way using Tie::File
use Tie::File; use strict; my (@A, @B, @C); my ($field1, $A, $B); tie @B, 'Tie::File', 'txtA.txt' or die "couldn't TiE $!\n"; tie @A, 'Tie::File', 'txtB.txt' or die "couldn't TiE $!\n"; foreach $A (@A) { my ($field1) = split/:/, $A; print $field1; foreach $B (@B){ if($B=~/^$field1/){ #found match push it onto C push @C, $A;} } } ## We remove those that didn't match by replacing @A with @C :) @A = @C; print @A;
Here are the test files
txtA.txt
filea:file2:file1 file2:something:old
txtB.txt
fileB:file2:file3 filea:file2:file1 file2:filex:file23 file34:file2:file3 filea:file2:file1 file2:filex:file23
Cheers, James Edit:removed a label