http://qs321.pair.com?node_id=111644

From Pattern Finding. Update: silly me. It works now.
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; }