Re: A ghost in the machine?

Eric Howe <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <[email protected]>
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:[email protected]] Sent: Thursday, January 14, 2010 10:45 AM
>>> To: [email protected]
>>> 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
[email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.