This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Perl RT #122761 - split /\A/ should not behave like split /^/m
authorYves Orton <demerphq@gmail.com>
Wed, 17 Sep 2014 02:36:57 +0000 (04:36 +0200)
committerYves Orton <demerphq@gmail.com>
Wed, 17 Sep 2014 02:47:34 +0000 (04:47 +0200)
commit1645b83c5ceecd8a95db0310d80125d8b188eb83
tree897530317120932fc88111dda78ff9b9d0b50a10
parentaa48e906ca55e0da8e1317549a4ddafff3837f3f
Perl RT #122761 - split /\A/ should not behave like split /^/m

Long ago a weird special case was hacked into split so that it
treated C<split /^/> as if it was C<split /^/m>. At the time this
was done by letting the split PP code inspect the pattern, and IFF
it matched "^\0" the special behavior was enabled (which also
bypasses using the regex engine for matching.)

Later on when we added pluggable regex engines and when we
encountered various counter-intuitive behaviors related to split
we changed who this worked so that the regex engine would
set flags appropriate for split to use. This meant that regex
plugins using totally different regex syntax could still enable
the optimisation. At the same time I modified how we detected
this pattern type by looking at the *compiled* regops, and not
the raw pattern. This had the side effect of making things like
C< split /(?:)^/ > also enable the optimisation.

Unfortunately this did not play nicely with the fact that /^/
produces an SBOL node, as does /\A/, but we definitely don't want
C<split /\A/> to behave like C<split /^/m>. In fact C<split /\A/>
should behave like a noop (which means there is room for a future
optimisation here if someone cares to implement it.)

In the discussion attached to the ticket I propose what I consider
to be a better fix, default split patterns to be compiled by default
with the /m modifier enabled. This patch does NOT do this. It is
instead the "simple" patch. This means that C<split /^/> behaves like
C<split /^/m> but C<split /^x/> does NOT behave like C<split /^x/m>
which I consider to be a bug which I will fix in a future patch.
regcomp.c
regcomp.sym
t/op/split.t