Hi Tosh, The function sigil ("&") is an archaic left over from before perl5. Calling a function as "&cfg" is the same as saying "&cfg(@_)" and that implicit "@_" was probably the source of your problem. A bit more information can be found here:
http://www.perlfoundation.org/perl5/index.cgi?subroutines_called_with_the_ampersand Executive summary: don't use "&" on a sub unless you need a sub-ref: my $x = \&cfg; $x->(); On 2010-01-14, at 13:28 , Tosh Cooey wrote: > Ok now I'm really boggled... > > If I use: > > my $vars = { config => &cfg() }; > instead of: > my $vars = { config => &cfg }; > > Then it works! So what's the difference between &cfg and &cfg() when it > comes to mod_perl, or at least ModPerl::Registry? > > Thank-you all... > > Tosh > > > Tosh Cooey wrote: >> True, good point. I cleaned up my code and changed some things around and I >> still have the same problem: >> index.pl >> ######## >> use MyConfig; >> use ClientConf; >> use MyUser; >> my $vars = { config => &cfg }; >> MyConfig.pm >> ########### >> package MyConfig; >> use strict; >> use Exporter; >> use vars qw(@ISA @EXPORT); >> @ISA = qw(Exporter); >> @EXPORT = qw(&cfg &user); >> my %CFG = { global vars... }; >> sub cfg { >> return ClientConf->new(); >> } >> sub user { >> return MyUser->new(); >> } >> 1; >> The function "user" works just fine, it returns the object as expected. >> #### BREAK #### >> So, while I was testing to make sure everything works exactly as I described >> above I discovered unexpected behaviour. &cfg is actually: >> sub cfg { >> my ($cfg_var) = @_; >> if ($cfg_var) { >> ...do something... >> } else { >> return ClientConf->new(); >> } >> } >> &user is exactly as noted above. When I changed &user and added the same >> $cfg_var and conditional it also did not return what I expected. >> So basically the problem I'm having is that even though I'm calling &cfg >> without arguments that $cfg_var is evaluating as "TRUE", but only under >> ModPerl::Registry and not under regular unadulterated PERL. >> As a PERL user for 15 years am I just the biggest newbie ever, or is there >> something obscure going on that I should know about? >> Thanks for anything! >> Tosh >> Ihnen, David wrote: >>> Global? There's no need to use a global here. You only ever reference >>> %CFG *in* the package... so just make it package scoped - it'll act like a >>> static variable and persist. (scope it with 'my' and remove it from the >>> export) >>> >>> You can always get the value you want with a call to MyConfig::cfg >>> >>> David >>> >>> -----Original Message----- >>> From: Tosh Cooey [mailto:t...@1200group.com] Sent: Thursday, January 14, >>> 2010 10:45 AM >>> To: modperl@perl.apache.org >>> Subject: A ghost in the machine? >>> >>> Hi to everyone! >>> >>> I'm trying to find out if I'm passing objects properly under mod_perl >>> because something is not working as I expect. >>> >>> index.pl >>> ######## >>> use MyConfig; >>> my $vars = { config => &cfg }; >>> >>> >>> MyConfig.pm >>> ########### >>> package MyConfig; >>> >>> use strict; >>> use Exporter; >>> use vars qw(@ISA @EXPORT %CFG ); >>> use ClientConf; >>> @ISA = qw(Exporter); >>> @EXPORT = qw(%CFG &cfg); >>> >>> %CFG = { global vars... }; >>> >>> sub cfg { >>> my $CFG{$clientID} = new ClientConf; >>> return $CFG{$clientID}; >>> } >>> 1; >>> >>> >>> Under normal PERL $vars->{config} is a MyConfig object. Under mod_perl >>> nothing is returned. Debugging with "print" statements in &cfg shows me >>> that "ref $CFG{$clientID}" is ClientConf, the object is there, but upon >>> return it just disappears. >>> >>> I have other functions which "return new MyUser()" and these work >>> perfectly, so I'm thinking that the problem lies with the global variable >>> "$CFG" and that something which I think should be happening is NOT >>> happening. >>> >>> I'm flummoxed... >>> >>> Thank-you for any insights! >>> >>> Tosh >>> > > -- > McIntosh Cooey - Twelve Hundred Group LLC - http://www.1200group.com/ Eric Howe e...@pieinsky.ca