open FIRST,"file1" or die "Can't open file1: $!\n"; open LAST,"file2" or die "Can't open file2: $!\n"; my (%names1,%names2) ; my $write_new = 0 ; while () { /(\w*) (\d*)/ ; $names1{$1} = $2 ; } close FIRST; while () { /(\w*) (\d*)/ ; $names2{$1} = $2 ; } close LAST; open NEW,">","file3" or die "Can't open file3: $!\n"; foreach (sort keys %names2) { if (defined($names1{$_})) { print NEW "$_ $names1{$_}\n" ; } else { print NEW "$_ $names2{$_}\n" ; } close NEW ; }