use strict; use warnings; use Algorithm::Loops qw(MapCarE); MapCarE { my ($s, $t) = @_; my $x= $t =~ /$s/ ? '~' : '!'; print "$t $x~ $s\n"; } [shift =~ /\[\w+\]|\w/g], # split source into chars or char classes [split //, shift]; # split target into chars #### D:\temp>mm [TCG]GGGG[AT] AGGGGC A !~ [TCG] G ~~ G G ~~ G G ~~ G G ~~ G C !~ [AT] D:\temp>mm [TCG]GGGG[AT] TGGGGC T ~~ [TCG] G ~~ G G ~~ G G ~~ G G ~~ G C !~ [AT]