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