SPUG: Scoping Guidelines; comments?

Tim Maher/CONSULTIX tim at consultix-inc.com
Thu Feb 17 23:13:43 CST 2000


SPUG-ticians,

The less experienced students in our Perl Programming classes tend to
have lots of trouble dealing with my vs. local, and hate nasty surprises
like File::Find trashing the $_ that's acting as their loop variable.

So I've been trying to come up with a "Cookbook" approach to 
providing "Scoping Guidance", and would be interested in the comments
of you professional Perl programmers out there on what I've come up
with so far.  Have I left anything important out?  Have I made
recommendations that you disagree with?

There's at least one recommendation here that I've never seen in any
Perl documentation; enclosing your main program in {}.  This either
means I've been amazingly clever in figuring out this useful technique 
n my own, or else I'm stupid because everybody else achieves the same
result in some other way; which is it? 8-}

There's also a sample program to drive home some of the points, which
must be somewhat cryptic to fit on the same page.

TIA,

-Tim

	The Consultix "Perl Scoping Guidelines", v0.8

FOR SMALL OR SIMPLE PROGRAMS
  Relax and enjoy the freedom of Perl !

FOR ALL NON-TRIVIAL PROGRAMS (including LARGE/COMPLEX ones)
* limit scope of variables
  > use my for user variables, local for pre-defineds ($_, $/, etc.)
* pass data to subs via the argument list (i.e., avoid globals)
* enclose main program in { }
  > so my vars won't have file scope, and leak into subs
	  defined below

IN LARGE OR COMPLEX PROGRAMS
* avoid using $_ ; widespread use creates many problems!
* localize temporary changes to built-in vars with new block
	{ local $,=' '; print; }
* put "use strict" at top of program, to force use of my()
  > if you need a global variable, qualify with package name; 
	$count becomes $main::count

SPECIAL CASES
* $_ automatically localized to { } when provided as default
	loop or function variable
*  foreach (LIST) { },  grep { } LIST,  map { }	LIST,  etc.

				EXAMPLE
	(somewhat nonsensical, but fits on page with above!)

{ 	# these parens confine MAIN variables declared with my()
	my  @names=('Joe', 'Nancy');
	local  $_='(303) 456-7890';
	foreach (@names) { print  "$_\n"; }  # different, local $_
	print  "$_\n";		# print the phone number
	my  $result = compute(@names);
	{ $\='\cL'; print  $result; }
}	# end of MAIN

sub  compute  {
	local  $_='Test Data';	# won't collide with main's $_
	foreach my $var (@_) {	#  $var unavailable to s2()
		s2( )  and  print  $var ;   }	#  $_ available to s2()
	my  $result=s2();  return  $result;	# not main's $result
}

*========================================================================*
| Tim Maher, PhD  Consultix &		   (206) 781-UNIX/8649		 |
|  Pacific Software Gurus, Inc		   Email: tim at consultix-inc.com	 |
|  UNIX/Linux & Perl Training		   http://www.consultix-inc.com	 |
| 2/22: UNIX  2/28: Perl Modules  2/29: Int. Perl  3/3: Pattern Matching |
*========================================================================*

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    POST TO: spug-list at pm.org        PROBLEMS: owner-spug-list at pm.org
 Seattle Perl Users Group (SPUG) Home Page: http://www.halcyon.com/spug/
 SUBSCRIBE/UNSUBSCRIBE: Replace ACTION below by subscribe or unsubscribe
        Email to majordomo at pm.org: ACTION spug-list your_address





More information about the spug-list mailing list