SPUG: Predeclaring packages

Ronald J Kimball rjk-spug at tamias.net
Sat Jan 3 12:44:09 PST 2009


On Sat, Jan 03, 2009 at 12:14:08PM -0800, DeRykus, Charles E wrote:
>  
> >> I wouldn't say that $our exposes a value for $greeting - it simply
> exposes $greeting itself.
> 
> Not to overdo semantics but the docs say 'our' exposes a value ..
> maybe just to emphasize that the global value set by 'our', although 
> similar in some ways to a lexical 'my',  behaves differently, eg, 

perldoc -f our states:

  "our" associates a simple name with a package variable in the current
  package for use within the current scope.

If some place in the documentation suggests that 'our' exposes a value, I'd
argue that's misleading and should be clarified.  :)

Not to put too fine a point on it, the global value is set by the
assignment, not by 'our'.


> You're right but the compile/runtime issues gets confusing 
> to me anyway because setting the global $Hello::greeting at 
> runtime does work but not via 'our'. 
>   
> 
> #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" }
> }

The documentation mentioned the "current package".  The commented-out line
in your code snippet is in the package main, not the package Hello.


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

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


Ronald


More information about the spug-list mailing list