SPUG: Predeclaring packages

DeRykus, Charles E charles.e.derykus at boeing.com
Sat Jan 3 19:26:04 PST 2009


 

On Sat, January 3, 2009 4:18 pm, DeRykus, Charles E wrote:
> On Sat, Jan 03, 2009 at 12:14:08PM -0800, DeRykus, Charles E wrote:
   #our $greeting = 'Hello there';     # not ok
   $Hello::greeting = 'Hello there';   # ok
   Hello::sayHi();
   exit(0);
 
  package Hello; { our $greeting;
  sub sayHi { our $greeting; print $greeting . "\n" } }

> Stranger yet it appears to work here:
>
> perl -wle 'our $x = 3; Foo::foo();  package Foo; sub foo { print $x};'
> 3

>> In your earlier example, you had an our later, in package Hello
(actually two).  Without that, it works:

>> our $greeting = 'Hello there';     # not ok
>> #$Hello::greeting = 'Hello there';   # ok
>> Hello::sayHi();
>> exit(0);

>> package Hello;
>> sub sayHi { print $greeting . "\n" }

Thanks, yes. Another subtlety. I'm beginning to think 'our' merits a
perltrap entry except that most people would run screaming if they 
looked closely  .. :)


A summary:

   Hello::sayHi();
   exit(0);

   package Hello;
   INIT { our $greeting = 'Hello there'; } 
   # sub sayHi {  print $greeting . "\n" };               # not ok 
   sub sayHi {  our $greeting; print $greeting . "\n" };  # ok 
   sub sayHi { print $Hello::greeting . "\n" }            # ok

But the same 'our' declaration apparently occludes the earlier value of
'our' 
in this variant unless you package qualify:

   our $greeting = 'Hello there';
   Hello::sayHi();
   exit(0);

   package Hello;
   # sub sayHi  { our $greeting; print $greeting; }        # not ok 
   sub sayHi  { our $greeting; print $main::greeting; }    # ok 
   sub sayHi { print $greeting . "\n" };                   # ok


-- 
Charles DeRykus


More information about the spug-list mailing list