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