I was wondering what the favored syntax in perl6 would be to match negative
multi-byte strings. In perl 5:
$sql = "select * from a where b union select * from c where d";
my $nonunion = "[^u]|u[^n]|un[^i]|uni[^o]|unio[^n]";
my (@subsqls) = ($sql =~ m"((?:$nonunion)*");
guaranteeing that the subsqls have all text up to, but not including the string
"union".
I suppose I could say:
rule nonunion { (.*) :: { fail if ($1 =~ m"union$"); } }
although that seems awful slow, and I suppose I that I could do the same thing
in perl6 as I did in perl5, although that gets ugly if you need to combine
matching strings without "union" in them with, say parens:
rule parens { \* [ <-[()]> + : | <self> ]* \) }
rule non_union_non_parens
{
[ < -[()u] > |
u < -[()n] > |
un < -[()i] > |
uni < -[()o] > |
unio < -[()n] >
]
}
my (@subsqls) = ($sql =~ m" ([ <non_union_non_parens> | <parens> ]*) ");
And finally, I suppose I could write a sql grammar (which for this application,
and most) is definitely overkill. So I guess I'd like something shorter,
something where you could say:
< -["union"] >
or
< -["union"\(\)] >
or
< -["union""select"\(\)] >
a generic negative, multi-byte string matching mechanism. Any thoughts?
Am I missing something already present or otherwise obvious?
Ed