in reply to Re^2: Scope and references
in thread Scope and references

Actually, for creates two lexical scopes. One for the entire statement, and one of the block body.

You've already demonstrated the second. Here's a demonstration of the first:

>perl -e"use strict; for (my @x) { } @x" Global symbol "@x" requires explicit package name at -e line 1. Execution of -e aborted due to compilation errors.

it seems like you don't "leave" the scope in which @a was delcared,

It's pretty clear to me the curly is the end of the scope, and you do indeed reach it.

Also, I still don't understand why the 'wrong' version creates the data structure that it does. Any thoughts on that one?

my @a; push @container, \@a; push @container, \@a;

Isn't it clear that it puts two references to the same variable into @container? Why do you think your loop is different?

Replies are listed 'Best First'.
Re^4: Scope and references
by 7stud (Deacon) on Jun 20, 2011 at 08:01 UTC

    Actually, for creates two lexical scopes. One for the entire statement, and one of the block body.

    You've already demonstrated the second. Here's a demonstration of the first:

    >perl -e"use strict; for (my @x) { } @x" Global symbol "@x" requires explicit package name at -e line 1. Execution of -e aborted due to compilation errors.

    I don't think your example serves to prove your statement. Here's what I think is a better example:

    use strict; use warnings; use 5.010; for (my @x) { my @x; } my @y; my @y; #line 10 --output:-- "my" variable @y masks earlier declaration in same scope at perl.pl li +ne 10.

      No, that only shows that there are two scopes total, not that for created two lexical scopes. You'd need

      my @x; for (my @x) { my @x; }

      Mine does show the same though. If for only created the scope int the curlier, my code wouldn't have died.