On Wed, 18 Sep 2002, Josh Jore wrote:
> On Wed, 18 Sep 2002, Damian Conway wrote:
>
> > > Would it be correct for this to print 0? Would it be correct for this
> > > to print 2?
> > >
> > > my $n = 0;
> > > "aargh" =~ /a* { $n++ } aargh/;
> > > print $n;
> >
> > Yes. ;-)
>
> Wouldn't that print 2 if $n is lexical and 0 if it's localized? Or are
> lexicals localized now?
Well, { $n++ } is within the lexical scope of $n, so it doesn't matter.
What matters is whether $n++ was hypotheticalized like so:
"aargh" =~ /a* { let $n++ } aargh/ # can it work that way?
Then it would either print 1 or 0, because if it backtracked, the ++ would
be undone. If the change is adopted that you can't optimize when there's
a closure in the middle of the optimization, it would print 1.
> > > What possible outputs are legal for this:
> > >
> > > "aaa" =~ /( a { print 1 } | a { print 2 })* { print "\n" } x/
>
> I take it that what I've learned from _Mastering_Regular_Expressions_
> doesn't quite apply here? From that interpretation I'd think it'd print
> "111\n" since the second part of the alternation wouldn't be tried.
The first time through, yes. But then it tries to match the "x", and says
"oops, that's not what I have" and backtracks. That tries the second of
the alternation, which doesn't work either. So it backtracks so the * is
only getting two of the first one, et cetera...
Or are you talking about something else from Mastering Regular
Expressions? Like some kind of optimization that happens?
Luke