open my $f1, '<', \<<''; string1 (C)C(T)A string2 T(A)GG(A)GGG(G) open my $f2, '<', \<<''; string1 1 C A string1 3 T C string2 5 A T string2 9 G A string2 2 A C my %h = map split, <$f1>; tr/()//d, $_ = [split //] for values %h; while (<$f2>) { local $" = ','; my ($k, $i, @combo) = split; $h{$k}[$i-1] = lc "{@combo}"; } for my $k (sort keys %h) { local $" = ''; while (<@{$h{$k}}>) { s/([a-z])/(\u$1)/g; print "$k $_\n"; } }