develooper Front page | perl.perl5.porters | Postings from November 2009

[BUG] [Regex] Is it a bug? Doing /\G(?=\<)/g twice.

Thread Next
From:
Shlomi Fish
Date:
November 4, 2009 05:44
Subject:
[BUG] [Regex] Is it a bug? Doing /\G(?=\<)/g twice.
Message ID:
200911041543.11885.shlomif@iglu.org.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?

This example is a little simplified - my real code is somewhat more complex 
and less silly.

Regards,

	Shlomi Fish

-- 
-----------------------------------------------------------------
Shlomi Fish       http://www.shlomifish.org/
Freecell Solver - http://fc-solve.berlios.de/

Chuck Norris read the entire English Wikipedia in 24 hours. Twice.

Thread Next


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