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

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

Thread Previous | Thread Next
From:
demerphq
Date:
November 4, 2009 06:01
Subject:
Re: [BUG] [Regex] Is it a bug? Doing /\G(?=\<)/g twice.
Message ID:
9b18b3110911040601k7cd2a051q798200e6253c6cc5@mail.gmail.com
2009/11/4 Shlomi Fish <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?

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 Previous | 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