In a message dated 2 Sep 2002, Aaron Sherman writes:

> I'm working on a library of rules and subroutines for dealing with UNIX
> system files. This is really just a mental exercise to help me grasp the
> new pattern stuff from A5.
>
> I've hit a snag, though, on hypothetical variables. How would this code
> work?
>
>     {
>       my $x = 2;
>       my $y = "The grass is green";
>       $y =~ /(gr\w+) {let $x = $1}/;
>     }
>
> I assume that it would change C<$x> from C<2> to C<"grass">.

Yes.  $0{x} would be set to "grass".  A lexical variable has been defined
in the same scope as the hypothetical with the same name, so its value is
set hypothetically (is hypothetically bound to?) $0{x}.  When the rule
succeeds, $x's hypothetical value is made permanent.

> But here's
> the case where I'm concerned:
>
>     module foo;
>     rule gr_word { (gr\w+) {let $x = $1} }
>     ----my code----
>     use foo;
>     my $x = 2;
>     "The grass is green" =~ /<gr_word>/;
>
> Would my local C<$x> be reset to C<"grass">?

No.  $0{x} would be set to "grass".  $x would stay as 2.  $x is in a
different scope from the hypothetical, so it doesn't get touched.

> That would seem to lead to
> some very ugly namespace problems, since the module user never asked to
> have C<$x> replaced, it's just a silent side-effect.

Nope, shouldn't have any effect.

> Please tell me there's some magic way that this works, so that I'm wrong
> :)

I don't think it's magic.  It's just scoping.

Trey

Reply via email to