in reply to Re: Lexical pad / attribute confusion
in thread Lexical pad / attribute confusion

It's for that reason that you can write my $x = 10; { my $x = $x; print $x } and get 10.

Ah. This makes the behaviour of the attribute handler make sense. Hadn't thought of that. It does mean that the documentation in attributes is an oversimplification when it says:

my ($x,@y,%z) : Bent = 1;

is equivalent to

use attributes (); my ($x,@y,%z); attributes::->import(__PACKAGE__, \$x, 'Bent'); attributes::->import(__PACKAGE__, \@y, 'Bent'); attributes::->import(__PACKAGE__, \%z, 'Bent'); ($x,@y,%z) = 1;

because things like this DWIM:

my ($x,@y,%z) : Bent = (@y);

Right then. With the attribute issue out of the way - I'm still confused why INIT can see everything. Since you can also see everything in CHECK and END blocks, which are run after compilation, I still don't understand what is going on.

Replies are listed 'Best First'.
Re: Re^2: Lexical pad / attribute confusion
by djantzen (Priest) on Dec 22, 2002 at 02:05 UTC

    Since you can also see everything in CHECK and END blocks, which are run after compilation, I still don't understand what is going on.

    I think it's because at those stages in the program's lifecycle you don't have a runtime scope, or perhaps it's better said that the entire program is in their scope. They see everything written on a particular pad by the compiler, without perl hiding entries according to scoping rules. (Update: see diotalevi's remark above.)