On Sun, 15 Jan 2017 05:06:21 -0800, ronaldxs wrote: > So "42" ~~ / [ "0" || "42" ] | "4" / matches 4 but if you stick to just > one kind of alternation: > > "42" ~~ / [ "0" | "42" ] | "4" / > > "42" ~~ / [ "0" || "42" ] || "4" / > > the match correctly comes back with 42. It looks like in the mixed case > the "|" longest alternation is not picking the longest match which is a > bug. > This is not a bug. `||` is by design not declarative, and so only the first branch of it is significant for LTM purposes. This behavior can be confirmed by re-ordering the imperative alternation:
> "42" ~~ / [ "0" || "42" ] | "4" / 「4」 > "42" ~~ / [ "42" || "0" ] | "4" / 「42」 Therefore, the longest declarative match is 4, and so that is the branch that LTM selects. Since there's no anchoring, there's furthermore no reason for it to backtrack into the second branch of the `|` to try the other `||` branch. I'm pretty sure this behavior is relied upon in the Perl 6 grammar itself; off the top of my head, it shows up in a bunch of places for the sake of error handling. So, working as designed. Thanks, /jnthn