On Wed, 2003-09-03 at 21:24, Stas Bekman wrote:
> [...]
> >>In effect you use local() to undef the variable, instead of explicitly
> >>initializing it. Why not doing this explictly?
> > 
> > 
> > Firstly it's conceptually neater to use local.  I want to think of the
> > variable as local rather than as a global variable that needs to be
> > explicitly reset.
> 
> local is perl4-ism, nowadays it's used only for localizing special perl 
> variables, like $|.

I agree, using local, and especially "local our" is pretty strange.  It
may work, but I wouldn't want to encourage people to do that in their
code.

> To summarize:
> 
> - move the perl4 lib solution to the perl_reference.pod
> - suggest replacing my() with our() to avoid the closure, however this change 
> requires that the variables will be initialized before used in most cases 
> (example of 'open our $foo' which doesn't need to be initialized). you can 
> initialize variables by an explicit assignment of the value, or using the 
> 'local our' trick, which will initialize the variable to under, which is 
> probably not what you want.
> - for users of perl < 5.6 suggest to use 'use vars' instead of 'our'.
> - point to perl_reference.pod for other workarounds/solutions.

May I also suggest telling users to pass arguments explicitly to subs,
instead of doing it implicitly?  Nearly all of the Registry-related bugs
I see stem from people doing this:

my $cgi = CGI->new();

foo()

sub foo {
  $cgi->param(whatever)...
}

They accidentally create a closure this way and then wonder why their
form values never change.  Passing $cgi to foo() fixes the problem.

- Perrin



-- 
Reporting bugs: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html

Reply via email to