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).


In reply to Re^13: Accessing lexicals in other scopes dynamically by name by ikegami
in thread Accessing lexicals in other scopes dynamically by name by LanX

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.