perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Eric Howe <e...@pieinsky.ca>
Subject Re: A ghost in the machine?
Date Thu, 14 Jan 2010 21:42:13 GMT
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:tosh@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
eric@pieinsky.ca


Mime
View raw message