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