Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use of (?| ...) breaks \G or vice-versa #12097

Open
p5pRT opened this issue May 12, 2012 · 7 comments
Open

Use of (?| ...) breaks \G or vice-versa #12097

p5pRT opened this issue May 12, 2012 · 7 comments

Comments

@p5pRT
Copy link

p5pRT commented May 12, 2012

Migrated from rt.perl.org#112894 (status was 'open')

Searchable as RT112894$

@p5pRT
Copy link
Author

p5pRT commented May 12, 2012

From @jimav

Created by @jimav

This is a bug report for perl from james_avera@​yahoo.com,
generated with the help of perlbug 1.39 running under perl 5.12.4.

-----------------------------------------------------------------
If $(?|...) is used in a /\G ... /xsgc pattern then the match fails.
If \G is removed -or- if $(?|...) is changed to $(?​:...) then it works.

(The matched text is at the beginning of the string so \G should not
matter in this case).

#!/usr/bin/perl
use strict; use warnings;

$_ = '{foo{bar}baz}';
if (/\G
  (?| # <--BUG HERE​: fails if (?|...) but works if (?​:...)
  # or if \G is removed
  (SomethingElse)
  | ( \{ (?​: \\. | [^\{\}\\]++ | (?-1))* \} )
  )
  /xsgc)
{
  print "MATCHED​:\n";
  print " 1=$1\n" if defined $1;
  print " 2=$2\n" if defined $2;
} else {
  print "MATCH FAILED\n";
}

Perl Info

Flags:
     category=core
     severity=high

Site configuration information for perl 5.12.4:

Configured by Debian Project at Tue Sep  6 08:08:24 UTC 2011.

Summary of my perl5 (revision 5 version 12 subversion 4) configuration:

   Platform:
     osname=linux, osvers=2.6.24-28-server, 
archname=x86_64-linux-gnu-thread-multi
     uname='linux allspice 2.6.24-28-server #1 smp wed aug 18 21:17:51 
utc 2010 x86_64 x86_64 x86_64 gnulinux '
     config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN 
-Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr 
-Dprivlib=/usr/share/perl/5.12 -Darchlib=/usr/lib/perl/5.12 
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local 
-Dsitelib=/usr/local/share/perl/5.12.4 
-Dsitearch=/usr/local/lib/perl/5.12.4 -Dman1dir=/usr/share/man/man1 
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 
-Dsiteman3dir=/usr/local/man/man3 -Duse64bitint -Dman1ext=1 
-Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm 
-Uusesfio -Uusenm -Ui_libutil -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib 
-Dlibperl=libperl.so.5.12.4 -des'
     hint=recommended, useposix=true, d_sigaction=define
     useithreads=define, usemultiplicity=define
     useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
     use64bitint=define, use64bitall=define, uselongdouble=undef
     usemymalloc=n, bincompat5005=undef
   Compiler:
     cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN 
-fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include 
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
     optimize='-O2 -g',
     cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing 
-pipe -fstack-protector -I/usr/local/include'
     ccversion='', gccversion='4.6.1', gccosandvers=''
     intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
     d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
     ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', 
lseeksize=8
     alignbytes=8, prototype=define
   Linker and Libraries:
     ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
     libpth=/usr/local/lib /lib/x86_64-linux-gnu /lib/../lib 
/usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib /usr/lib
     libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
     perllibs=-ldl -lm -lpthread -lc -lcrypt
     libc=, so=so, useshrplib=true, libperl=libperl.so.5.12.4
     gnulibc_version='2.13'
   Dynamic Linking:
     dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
     cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib 
-fstack-protector'

Locally applied patches:



@INC for perl 5.12.4:
     /home/jima/local/share/perl/5.12.4
     /home/jima/local/share/perl
     /home/jima/lib/perl
     /etc/perl
     /usr/local/lib/perl/5.12.4
     /usr/local/share/perl/5.12.4
     /usr/lib/perl5
     /usr/share/perl5
     /usr/lib/perl/5.12
     /usr/share/perl/5.12
     /usr/local/lib/site_perl
     .


Environment for perl 5.12.4:
     HOME=/home/jima
     LANG=en_US.UTF-8
     LANGUAGE (unset)
     LD_LIBRARY_PATH=/home/jima/local/lib
     LOGDIR (unset)
 
PATH=/home/jima/bin:/home/jima/local/bin:/home/jima/jima_tools/linux86_64/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/X11:/usr/local/bin:/opt/openoffice.org3/program:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/games:.
     PERL5LIB=/home/jima/local/share/perl:/home/jima/lib/perl
     PERL_BADLANG (unset)
     SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Jun 18, 2012

From @demerphq

Hrm, this is an unfortunate side effect of how the implementation of
C< (?|..) > and (?-1) work together. The \G is actually irrelevant as
without it the pattern matches at a different place and does not use (?
-1) to match.

I had hoped that named captures would solve this problem, but they suffer
from the same thing. I will investigate further.

@p5pRT
Copy link
Author

p5pRT commented Jun 18, 2012

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Jun 18, 2012

From @demerphq

On 18 June 2012 19​:53, yves orton via RT <perlbug-followup@​perl.org> wrote​:

Hrm, this is an unfortunate side effect of how the implementation of
C< (?|..) > and (?-1) work together.  The \G is actually irrelevant as
without it the pattern matches at a different place and does not use (?
-1) to match.

I had hoped that named captures would solve this problem, but they suffer
from the same thing. I will investigate further.

I also noticed a weird parse bug if you write the original pattern
with (?&1) which needs to be fixed as well.

Yves

--
perl -Mre=debug -e "/just|another|perl|hacker/"

@p5pRT
Copy link
Author

p5pRT commented Jun 18, 2012

From @cpansprout

On Mon Jun 18 10​:55​:15 2012, demerphq wrote​:

On 18 June 2012 19​:53, yves orton via RT <perlbug-followup@​perl.org>
wrote​:

Hrm, this is an unfortunate side effect of how the implementation of
C< (?|..) > and (?-1) work together. �The \G is actually irrelevant as
without it the pattern matches at a different place and does not use (?
-1) to match.

I had hoped that named captures would solve this problem, but they
suffer
from the same thing. I will investigate further.

I also noticed a weird parse bug if you write the original pattern
with (?&1) which needs to be fixed as well.

You mean bug #101666?

--

Father Chrysostomos

@p5pRT
Copy link
Author

p5pRT commented Jun 23, 2012

From @demerphq

On Mon Jun 18 12​:57​:33 2012, sprout wrote​:

On Mon Jun 18 10​:55​:15 2012, demerphq wrote​:

On 18 June 2012 19​:53, yves orton via RT <perlbug-followup@​perl.org>
wrote​:

Hrm, this is an unfortunate side effect of how the implementation
of
C< (?|..) > and (?-1) work together. �The \G is actually
irrelevant as
without it the pattern matches at a different place and does not
use (?
-1) to match.

I had hoped that named captures would solve this problem, but they
suffer
from the same thing. I will investigate further.

I also noticed a weird parse bug if you write the original pattern
with (?&1) which needs to be fixed as well.

You mean bug #101666?

Yes, thanks for the pointer. I have now resolved the problem and closed
that ticket.

cheers,
yves

@p5pRT
Copy link
Author

p5pRT commented Jun 17, 2013

From @jkeenan

On Sat Jun 23 05​:30​:03 2012, demerphq wrote​:

On Mon Jun 18 12​:57​:33 2012, sprout wrote​:

On Mon Jun 18 10​:55​:15 2012, demerphq wrote​:

On 18 June 2012 19​:53, yves orton via RT <perlbug-followup@​perl.org>
wrote​:

Hrm, this is an unfortunate side effect of how the implementation
of
C< (?|..) > and (?-1) work together. �The \G is actually
irrelevant as
without it the pattern matches at a different place and does not
use (?
-1) to match.

I had hoped that named captures would solve this problem, but they
suffer
from the same thing. I will investigate further.

I also noticed a weird parse bug if you write the original pattern
with (?&1) which needs to be fixed as well.

You mean bug #101666?

Yes, thanks for the pointer. I have now resolved the problem and closed
that ticket.

cheers,
yves

Yves, can we get an update on the status of *this* RT?

Thank you very much.
Jim Keenan

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants