Loading ...
Sorry, an error occurred while loading the content.

54312Re: PATCH porting.pod "First Mystery"

Expand Messages
  • Perrin Harkins
    Sep 3, 2003
      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

      > 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();


      sub foo {

      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
    • Show all 20 messages in this topic