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