Phoenix.pm: Attribute::Handlers and BEGIN blocks -- question(s)

Scott Walters phaedrus at illogics.org
Sun Dec 23 22:55:13 CST 2001


Doug,

Too lazy to look at the module, but that was my suspicion exactly ;)
In other news, anyone else see the Slashdot link re: Intel & Oregon vs
Randal Schwartz?
http://slashdot.org/yro/01/12/23/2145228.shtml

Hmm. Felony to do "anything unauthorized on a computer". That gives
ya warm fuzzies...

Thanks for the link, Doug. 
http://www.cs.oberlin.edu/classes/dragn/labs/combinators/combinators11.html
 -- on currying specificly.

-scott

On Sun, 23 Dec 2001, Doug and Julie Miles wrote:

> At 03:46 PM 12/22/01 -0700, you wrote:
> >Hello all,
> >
> >Have a question for anyone that might be familiar with Attribute::Handlers
> >module. Even if you're not familiar maybe you can provide insight into why
> >the following is happening...
> >
> >Ok, first BEGIN blocks should be evaluated before the rest of the script,
> >FIFO order. So the following:
> >
> >
> >#!/usr/bin/perl
> >
> >print "Top of script\n";
> >
> >BEGIN{
> >     print "BEGIN 1\n";
> >}
> >
> >print "Middle\n";
> >
> >BEGIN{
> >     print "BEGIN 2\n";
> >}
> >
> >
> >will print:
> >
> >BEGIN 1
> >BEGIN 2
> >Top of script
> >Middle
> >
> >
> >Now take the following code:
> >
> >#!/usr/bin/perl
> >
> >   my $test : Test;  #set an attribute for variable
> >
> >   print "Top\n";
> >
> >    BEGIN{
> >        print "In BEGIN 1\n";
> >        use Attribute::Handlers;
> >        sub Test($;) : ATTR(SCALAR, BEGIN) {
> >            print "In profiled sub\n";
> >        }
> >    }
> >
> >   print "Middle\n";
> >
> >   BEGIN{
> >       print "In BEGIN 2\n";
> >   }
> >
> >
> >This gives the following error:
> >
> >Invalid SCALAR attribute: Test at t.pl line 3
> >BEGIN failed--compilation aborted at t.pl line 3.
> >
> >
> >which I really don't understand as it seems it is parsing '$test : Test;'
> >before the BEGIN blocks? I try to assign $test right after the attribute
> >setting and display it within the BEGIN blocks but under -w gives the
> >following (which I would expect):
> >
> >Use of uninitialized value in concatenation (.) at t.pl line 9.
> >
> >because $test should not exist within the BEGIN block meaning it hasn't yet
> >been looked at by the compiler.
> >
> >Why then do I get the 'Invalid SCALAR arttribute' error? The order of
> >processing in the above code is:
> >
> >Attribute::Handlers::import
> >BEGIN 1
> >BEGIN 2
> >script
> >
> >Which means the atribute handler Test should be parsed before the assignment
> >of $test...
> >
> >I know I can fix it by moving the assignment but I'm just curoius as to why
> >it is happening.
> 
> I'm not familiar with Attribute::Handlers, so take this with a grain of salt...
> 
> I checked Programming Perl 3rd Ed., and thus spake the camel (on page 465):
> 
>    BEGIN blocks are handed off to the interpreter to be RUN as as(sic) soon 
> as they are
>    parsed, which effectively runs them in FIFO order (first in, first 
> out).  (Emphasis mine)
> 
> I would guess that Attribute::Handlers is playing some magic with Perl's 
> syntax, and if that syntax is used before the "use Attribute::Handlers" 
> (which is treated like a BEGIN), the perl compiler will barf on the 
> unrecognized syntax. So, compile wise, it should be this:
> 
> script
> BEGIN 1
> Attribute::Handlers::import
> script
> BEGIN 2
> 
> I'm in over my head, so I could be wrong.  Does anyone else want to confirm 
> or deny this?
> 
> 




More information about the Phoenix-pm mailing list