ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> perl5-porters
perl5-porters
Re: [BUG] [Regex] Is it a bug? Doing /\G(?=\<)/g twice.
by Demerphq other posts by this author
Nov 4 2009 6:02AM messages near this date
[BUG] [Regex] Is it a bug? Doing /\G(?=\<)/g twice. | Re: [BUG] [Regex] Is it a bug? Doing /\G(?=\<)/g twice.
2009/11/4 Shlomi Fish <shlomif@[...].il> :
>  Hi all!
> 
>  Today I ran into a problem with some parsing code of mine, and I was able to
>  reduce it into the following testcase:
> 
>  ----------------------
>  #!/usr/bin/perl
> 
>  use strict;
>  use warnings;
> 
>  my $text = "<title>";
>  pos($text) = 0;
>  print (($text =~ m{\G(?=<)}cg) ? "True" : "False");
>  print "\n";
>  print 'pos($text) = ', pos($text), "\n";
>  print (($text =~ m{\G(?=<)}cg) ? "True" : "False");
>  print "\n";
>  ----------------------
> 
>  This prints "True" and then "False". The latter surprised me. After chatting
>  with it on irc://irc.perl.org/p5p , nothingmuch gave the following
>  explanation:
> 
>  ---------------------
>  #!/usr/bin/perl
> 
>  use strict;
>  use warnings;
> 
>  use Devel::Peek;
>  no warnings 'uninitialized';
> 
>  local $\ = "\n";
> 
>  my $text = "<title>";
> 
>  print "pristine ", pos($text);
>  Dump($text);
> 
>  pos($text) = 0;
>  print "reset pos ", pos($text);
>  Dump($text);
> 
>  print (($text =~ m{\G}cg) ? "True" : "False");
>  print "after successful match pos is ", pos($text);
>  Dump($text);
> 
>  print (($text =~ m{\G}g) ? "True" : "False");
>  print "after failed match ", pos($text);
>  Dump($text);
>  ---------------------
> 
>  However, to me it seems that implementation details put aside, the code above
>  should just work and return two "True"'s.
> 
>  I've tried it with the Mandriva Cooker perl, and perl-5.8.8 and perl-5.10.x-
>  latest and they all exhibit the same bug.
> 
>  Could anyone comment on it? Is this behaviour (arguably mis-behaviour)
>  documented anywhere or can anyone give me a good reason for why it should not
>  work?

If it didnt work then s///g or m//g might result in infinite loops,
and split //, $string wouldnt work either.

It is arguable the *exact* rules for how it works are not so sane, but
at this point it is too late to change them.

cheers,
yves


-- 
perl -Mre=debug -e "/just|another|perl|hacker/"
Thread:
Shlomi Fish
Demerphq
Zefram

Privacy Policy | Email Opt-out | Feedback | Syndication
© ActiveState Software Inc. All rights reserved