22 May 2009
Some notes for me as I attempt to get a better understanding of Perl’s variable scoping rules. A work in progress.
- Perl has 2 separate ‘namespaces’ for variables – package aka global (Perl 4) and my aka private aka lexical scoping (Perl 5)
- the default package is main, this can be changed with the statement package foo; which then applies to all subsequent code until another package statement is encountered
- lexical scoping is done with {} (either via subroutines/operators or ‘naked blocks’); the top level is the file itself (‘file level’).
- use strict; **(specifically **use strict ‘vars’;) requires that variables either use a package qualifier (eg $main::foo) if they’re package variables or be lexical variables declared with my. You can get around this extra typing for package variables with use vars (or no strict ‘vars’ for a block)
- our($foo,$bar) is like use vars qw($foo $bar), however it’s lexical ie can be restricted by {}’s (an equivalent no use vars doesn’t exist). Looked at it another way, our ‘spans’ package declarations (as it’s lexical) whereas use vars is ‘reset’ by package declarations.
Also:
- dynamic scoping is done with local – see Wikipedia – Scope (programming). Lexical scoping is the norm in modern programming languages, dynamic scoping is a Lisp’y idea that uses a sort of stack for variable scope resolution, that can only be determined at runtime. *When to use local? Rarely. *Seven Useful Uses of local
- local only works with package variables not lexical/my variables; an example of where local can be useful is to temporarily change a Global Special Variable (eg $) $EFFECTIVE_GROUP_ID) before calling a subroutine: “local saves away the value of a package global and substitutes a new value for all code within and called from the block in which the local declaration is made” eg
{ local $) = getgrnam(USER) if $< == 0; enable($host); }
- do C-style static variables in this manner:
{ my $seed = 1; sub my_rand { $seed = int(($seed * 1103515245 + 12345) / 65536) % 32768; return $seed; } }
- xx
Some Links:
comments powered by Disqus