use v5.12;
use warnings;
use Data::Dump;
#ddx
my @words = map { "..X${_}X.." } <{a,b,c,d}{a,b,c,d}{a,b,c,d}>;
my $class = "[abc]";
#$class = '.'; #uncomment to match d too
my $len = 3;
for (@words) {
say "$_"
if $_ =~ / X # start anchor
(
($class)
(?!
.{0,$len}
\g{-1} # relative backreference
.*?
X
)
){$len}
X # end anchor
/x;
}
####
..XabcX..
..XacbX..
..XbacX..
..XbcaX..
..XcabX..
..XcbaX..
##
##
.*?
X # end anchor