sub find_pat { use re 'eval'; my $n = shift; my $re = qq{ (?{ local (@{[ map "\$c$_,", 1 .. $n ]}) = (0) x $n }) ^ }; $re .= qq{ (.+?) (?: @{[ join " |\n", map " \\$_ (?{ local \$c$_ = \$c$_ + 1 })", 1 .. $_ ]} )* } for 1 .. $n; $re .= qq{ (?(?{ @{[ join ' && ', map "\$c$_", 1 .. $n ]} })|(?!)) \$ }; return qr/$re/x; }