in reply to Re^12: Accessing lexicals in other scopes dynamically by name
in thread Accessing lexicals in other scopes dynamically by name

I suppose the "binding" of the name "$a" to the value "1" is recorded in some data-structure (whatever that data-structure is called in the internals of Perl).

You're mixing compile-time events with run-time events.

The slot is added to the pad ("the data structure") at compile time (i.e. once per "my" in the code).

The assignment of "1" to the scalar occurs at run-time (i.e. once every time "my" is evaluated).

Under your model, the following code would add 8 entries to "the data structure" over time.

for (1..4) { my $a = 1; my $b = 2; }

Perl only does that twice, at compile time.

(Independently, there's an optimisation in place that makes it so only two scalars are created in total. They are cleared and reused rather than freed.)

What happens in the interpreter when a statement such as "my $a=1;" is encountered?

At compile time, it declares the variable, i.e. adds a slot to the function's pad for $b.

At run-time, it assigns 1 to the variable after placing an instruction on the stack to clear (or replace) the variable on scope exit (the aformentioned optimisation).

Replies are listed 'Best First'.
Re^14: Accessing lexicals in other scopes dynamically by name
by morgon (Priest) on Aug 02, 2010 at 00:54 UTC
    Ok, thanks for the elaboration.

    But why does a closure not simply have a pointer to the pad (thereby gaining access to all lexcials)?

      Because it would be bad for this code to print "b" twice.