develooper Front page | perl.perl5.porters | Postings from July 2016

[perl #5004] [bug? 5.6.0] \G in split pattern

From:
Dan Collins via RT
Date:
July 4, 2016 03:30
Subject:
[perl #5004] [bug? 5.6.0] \G in split pattern
Message ID:
rt-4.0.18-29605-1467603046-148.5004-15-0@perl.org
Is \G intended to be meaningful in an argument to split? Instrumenting two variations tells me that \G and pos() do not work within split//:

    dcollins@nightshade64:~/toolchain/perl/t$ ./perl -Dr -le 'print join("*", split(/(?{print "POS: " . pos() . "\n";})\G(.)/, "banana"))'
    Compiling REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)"
    Final program:
       1: EVAL (4)
       4: GPOS (5)
       5: OPEN1 (7)
       7:   REG_ANY (8)
       8: CLOSE1 (10)
      10: END (0)
    anchored(GPOS) GPOS:0 minlen 1 with eval
    Enabling $` $& $' support (0x7).

    EXECUTING...

    Matching REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)" against "banana"
       0 <> <banana>             |   0| 1:EVAL(4)
    POS: 0

       0 <> <banana>             |   0| 4:GPOS(5)
       0 <> <banana>             |   0| 5:OPEN1(7)
       0 <> <banana>             |   0| 7:REG_ANY(8)
       1 <b> <anana>             |   0| 8:CLOSE1(10)
       1 <b> <anana>             |   0| 10:END(0)
    Match successful!
    Matching REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)" against "anana"
       0 <> <banana>             |   0| 1:EVAL(4)
    POS: 0

       0 <> <banana>             |   0| 4:GPOS(5)
       0 <> <banana>             |   0| 5:OPEN1(7)
       0 <> <banana>             |   0| 7:REG_ANY(8)
       1 <b> <anana>             |   0| 8:CLOSE1(10)
       1 <b> <anana>             |   0| 10:END(0)
    Match possible, but length=1 is smaller than requested=2, failing!
    Match failed
    *b*anana
    
    
    dcollins@nightshade64:~/toolchain/perl/t$ ./perl -Dr -le 'while ("banana" =~ /(?{print "POS: " . pos() . "\n";})\G(.)/g) {print "$&\n";}'
    Compiling REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)"
    Final program:
       1: EVAL (4)
       4: GPOS (5)
       5: OPEN1 (7)
       7:   REG_ANY (8)
       8: CLOSE1 (10)
      10: END (0)
    anchored(GPOS) GPOS:0 minlen 1 with eval
    Enabling $` $& $' support (0x7).

    EXECUTING...

    Matching REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)" against "banana"
       0 <> <banana>             |   0| 1:EVAL(4)
    POS: 0

       0 <> <banana>             |   0| 4:GPOS(5)
       0 <> <banana>             |   0| 5:OPEN1(7)
       0 <> <banana>             |   0| 7:REG_ANY(8)
       1 <b> <anana>             |   0| 8:CLOSE1(10)
       1 <b> <anana>             |   0| 10:END(0)
    Match successful!
    b

    Matching REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)" against "anana"
       1 <b> <anana>             |   0| 1:EVAL(4)
    POS: 1

       1 <b> <anana>             |   0| 4:GPOS(5)
       1 <b> <anana>             |   0| 5:OPEN1(7)
       1 <b> <anana>             |   0| 7:REG_ANY(8)
       2 <ba> <nana>             |   0| 8:CLOSE1(10)
       2 <ba> <nana>             |   0| 10:END(0)
    Match successful!
    a

    Matching REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)" against "nana"
       2 <ba> <nana>             |   0| 1:EVAL(4)
    POS: 2

       2 <ba> <nana>             |   0| 4:GPOS(5)
       2 <ba> <nana>             |   0| 5:OPEN1(7)
       2 <ba> <nana>             |   0| 7:REG_ANY(8)
       3 <ban> <ana>             |   0| 8:CLOSE1(10)
       3 <ban> <ana>             |   0| 10:END(0)
    Match successful!
    n

    Matching REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)" against "ana"
       3 <ban> <ana>             |   0| 1:EVAL(4)
    POS: 3

       3 <ban> <ana>             |   0| 4:GPOS(5)
       3 <ban> <ana>             |   0| 5:OPEN1(7)
       3 <ban> <ana>             |   0| 7:REG_ANY(8)
       4 <bana> <na>             |   0| 8:CLOSE1(10)
       4 <bana> <na>             |   0| 10:END(0)
    Match successful!
    a

    Matching REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)" against "na"
       4 <bana> <na>             |   0| 1:EVAL(4)
    POS: 4

       4 <bana> <na>             |   0| 4:GPOS(5)
       4 <bana> <na>             |   0| 5:OPEN1(7)
       4 <bana> <na>             |   0| 7:REG_ANY(8)
       5 <banan> <a>             |   0| 8:CLOSE1(10)
       5 <banan> <a>             |   0| 10:END(0)
    Match successful!
    n

    Matching REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)" against "a"
       5 <banan> <a>             |   0| 1:EVAL(4)
    POS: 5

       5 <banan> <a>             |   0| 4:GPOS(5)
       5 <banan> <a>             |   0| 5:OPEN1(7)
       5 <banan> <a>             |   0| 7:REG_ANY(8)
       6 <banana> <>             |   0| 8:CLOSE1(10)
       6 <banana> <>             |   0| 10:END(0)
    Match successful!
    a

    Matching REx "(?{print %"POS: %" . pos() . %"\n%";})\G(.)" against ""
    Regex match can't succeed, so not even tried

Is this /supposed/ to work? is pos() or \G in any way a feature that is useful in split//?

---
via perlbug:  queue: perl5 status: open
https://rt.perl.org/Ticket/Display.html?id=5004



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About