my %map = ( a=>1, ab=>23, cd=>45 ); # 1. my ($regex) = map { qr/$_/ } # 2. join '|', map {quotemeta} sort { length $b <=> length $a or $a cmp $b } # 3. keys %map; print "$regex\n"; # 4. # Now, use the regex my @strings = qw/ abcd aacd abaab /; # 5. for (@strings) { my $before = $_; s/($regex)/$map{$1}/g; # 6. print "$before -> $_\n"; # 7. }