perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stas Bekman <s...@stason.org>
Subject Re: [MP2] eval and exit(0) : problem
Date Mon, 03 May 2004 19:41:24 GMT
Glenn wrote:
> On Mon, May 03, 2004 at 07:17:54PM +0200, Arnaud Blancher wrote:
> 
>>Stas Bekman a ?crit :
>>
>>
>>>Arnaud Blancher wrote:
>>>
>>>
>>>>Stas Bekman a ?crit :
>>>>
>>>>
>>>>>ydnar wrote:
>>>>>
>>>>>
>>>>>>The eval() is unecessary. The named sub can be used:
>>>>>>
>>>>>>&$func(); 
>>>>>
>>>>>
>>>>>
>>>>yes but not with
>>>>use strict
>>>>...
>>>
>>>
>>>try:
>>>
>>> {
>>>   no strict 'refs';
>>>   &$func();
>>> }
>>
>>
>>yes, it's work.
>>i'don't realy like this solution, just because i always  try to use 'use 
>>strict'
>>to avoid problem with mod_perl !!!!
> 
> 
> As Stas mentioned previously, you should be using coderefs: $func->()
> instead of eval() with &$func().   If you use eval () with &$func(),
> then I think you are bypassing some compile-time 'strict' checks on
> that code.  If you want the compiler to enforce maximum strictness
> (a good thing), and you always try to 'use strict', as you say above,
> then you should be using coderefs instead of &$func().  An example
> will better illustrate proper usage:
> 
> e.g. if you have the subroutines
> 
> sub routine_1 { ... }
> sub routine_2 { ... }
> 
> then instead of doing:
> 
> my $func = 'routine_1';
> [ ... ]
> &$func();
> 
> try the following:
> 
> my $func = \&routine_1;
> [ ... ]
> $func->();
> 
> That will compile cleanly with 'strict' in effect.
> 
> If you do not know the routine name in advance, then you can
> create a hash of 'routine_name' => coderef and look up the
> routines to get the proper coderef:
> 
> %valid_routines = ('routine_1'=>\&routine_1, 'routine_2'=>\&routine_2);
> 
> $func = $valid_routines{$routine_name} || die "invalid routine name";

Good point, Glenn. But it's actually not the style:

   &$func() and $func->() are the same strictness-checking-wise.

but the coderef vs. eval "string" that makes the difference. You can just as 
well do:

perl -wle 'use strict; sub foo { print "X" }; my $func = \&foo; &$func'
X

It's personal preference of whether to use $func->() vs &$func, with an added 
potential pitfall of &$func passing @_ along to the $func function, when () 
are forgotten. I prefer $func->() since it's clear that no arguments are 
passed. It's not clear in this code:

use strict;
sub foo { print @_ };
sub bar {
     my $func = \&foo;
     &$func;
};
bar("a")'

as you can see it prints "a", which you may not expect from &$func, unless you 
remember that &foo is special (this feature is there for 'goto &foo' 
constructs usually used in AUTOLOAD).

On the other hand:

sub bar {
     my $func = \&foo;
     $func->();
};

prints nada. and you can clearly see that no args are passed.

Certainly, you could write:

sub bar {
     my $func = \&foo;
     &$func();
};

and @_ won't be passed, but you may forget to add (), you can't forget them in 
$func->(). :)

--
__________________________________________________________________
Stas Bekman            JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/     mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org   http://ticketmaster.com

-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html


Mime
View raw message