Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re^5: Regexes: finding ALL matches (including overlap) (its a bug)

by demerphq (Chancellor)
on Jun 04, 2005 at 16:47 UTC ( #463543=note: print w/replies, xml ) Need Help??

in reply to Re^4: Regexes: finding ALL matches (including overlap)
in thread Regexes: finding ALL matches (including overlap)

Is there any way to rationalize the actual behavior without diving too deeply into the Perl internals?

Its very simple: it's a bug. (In an experimental feature.) Basically the way perls regex engine handles embedded code is subtly wrong in a number of ways. One aspect of this is that you should never use lexicals inside of regexes inside of a repeatable scope (such as the body of a loop or a subroutine). If you are doing a one off it will probably work as you expect, but as soon as you stick the code in a subroutine or something like that and call it twice things dont work out properly. The simple workaround as blokhead explained is to use package level variables and local.

#!perl -l use strict; use warnings; { # BAD for my $i (0..1) { my $count=0; 'abc'=~/.*(?{$count++})(??{'\\z\\A'})/; print "$i:$count"; } } { # Work around #1, single lexical my $count; for my $i (0..1) { $count=0; 'abc'=~/.*(?{$count++})(??{'\\z\\A'})/; print "$i:$count"; } } { # Work around #2, global explicitly named for my $i (0..1) { local $::count=0; 'abc'=~/.*(?{$::count++})(??{'\\z\\A'})/; print "$i:$::count"; } } { # Work around #3, global our $count; # or use vars qw/$count/; for my $i (0..1) { local $count=0; 'abc'=~/.*(?{$count++})(??{'\\z\\A'})/; print "$i:$count"; } }

I beleive dave_the_m has intentions of fixing this one day. But until then pay careful attention to the fact that embedded code is advertised as provisional and experimental which means that you can't really cry too much when it breaks.


  • Comment on Re^5: Regexes: finding ALL matches (including overlap) (its a bug)
  • Download Code

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://463543]
[1nickt]: (Disicpulus The new best choice is maybe "First People"
[karlgoethebier]: Discipulus: This is called "Volksverhetzung" in German which means
[karlgoethebier]: incitement of the people and it is prohibited by law
[1nickt]: The best sign I have sign in a protest march was carried by a kid of about 10 years "If you build a wall my generation will tear it down."
[1nickt]: ... sign I have seen ...
[1nickt]: Now that one made me hopeful! First time not angry in a long time when I saw that kid.
[Discipulus]: i propend for removing: why? because we are so few that we must find i minimal common divisor, this is certainly Perl not our (anyway private) thougths. And i say this still wondering because i love a lot freedom of expression. And i say this not for roho
[1nickt]: Discipulus that was the point of my story of taking the sticker off my truck. I know there are lots of people in the world who if I knw their private beliefs I might want to argue with them. And they with me. But life cannot all be arguments!
[1nickt]: This is less than perfect ... but demanding perfection (from people or from life) is a sure way to unhappiness.
[Discipulus]: and anyway we have CB where every (democratic) opinion can be expressed

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (9)
As of 2017-06-22 12:16 GMT
Find Nodes?
    Voting Booth?
    How many monitors do you use while coding?

    Results (519 votes). Check out past polls.