On Thu, 2005-05-12 at 13:44, Patrick R. Michaud wrote:
> On Thu, May 12, 2005 at 12:53:46PM -0400, Aaron Sherman wrote:

> > > In other words, it acts as though one had written
> > > 
> > >     $rule = rx :w / plane ::: (\d+) | train ::: (\w+) | auto ::: (\S+) / ;
> > > 
> > > and not
> > >     
> > >     $rule = rx :w /[ plane :: (\d+) | train :: (\w+) | auto :: (\S+) ]/ ;
> > 
> > Your two examples fail in the same way because of the fact that the
> > group IS the whole rule.
> 
> False.  In the first case the group is the whole rule.  In the second
> case the group would not include the (implied) '.*?' at the start of
> the rule.

That cannot be true. If it were, then:

        s/[a]//

and

        s/a//

would replace different things, and they MUST NOT. If I've missed some
fundamental way in which rx:p5/(?:...)/ is different from rx/[...]/,
then please let me know. Otherwise, we can simply demonstrate this with
P5:

        perl -le '"abcaabbcc" =~ /(?:aa)/;print $&'

and unshockingly, that prints "aa", not "abcaa"

> Note that the rule is *unanchored*, thus it tries at the first character,
> if it fails then it goes to the second character, if that fails it goes
> to the third, etc.  

Yes, you're correct, but when you step forward over input in order to
find a start for your unanchored expression, you do NOT consume that
input, grouping or not. To say:

        $foo ~~ /unanchored/

is something like

        for 0..length($foo)-1 -> $i {
                substr($foo,$i) ~~ /^unanchored/;
        }

and always has been. Unless I'm unaware of some subtlety of [], it is
just the same as P5's (?:...), which behaves exactly this way.

I'll skip the rest of your post for now, except for the last bit, since
I think we need to resolve which universe we're in before we can give
each other street directions ;-)

> > >     /[:w\bfoo bar]/    # not exactly the same as above
> > 
> > No, I think that's exactly the same.
> 
> Nope.  Consider:  
> 
>      $foo = rx /[:w::foo bar]/
>      $baz = rx /[:w\bfoo bar]/
> 
>      "myfoo bar" ~~ $foo          # matches
>      "myfoo bar" ~~ $baz          # fails, foo is not on a word boundary

You're correct, sorry about that.

-- 
Aaron Sherman <[EMAIL PROTECTED]>
Senior Systems Engineer and Toolsmith
"It's the sound of a satellite saying, 'get me down!'" -Shriekback


Reply via email to