In general it's best practice in any programming language to minimize scope, and often, it's helpful to initialize.
A var name just *appearing* in a sub, with no local declaration, or not passed in, is at best confusing, and at worst a disaster. It might be defined "miles away" from the sub. The poor bloke maintaining it years from now may have a devil of a time finding it, AND what if it's defined in many places?
bareblocks help minimize scope, I think about using them whenever I program. Many programmers scope at the "sub" level, but it helps to scope even deeper- within a sub. In general my rules for tite code include:
a Var's lifetime should be never preceed, or outlast, its usefulness
Declare at the last possible moment; go out of scope at the earliest
Here where I want to get an XML value from a file I might use
my $XMLval='';
{
open X,'myfile';
my @X= grep /<myfavoritetag>/,<X>;
last unless @X;
$X[0] =~ s/<\/?[^>]+>//g; # shoot the tag and end tag..
$XMLVal=$X[0];
}
# here we have $XMLval ready to go , all cleaned up,
# and @X is out of scope ,
# so no worries about it anymore or any other gobbltygook
# in the braces
I could have, and used to, just let @X "hang around" until the sub exited. After 30 years in Perl though, I'm much more conscious of scope and it's hazards.
It also makes intent clearer- when leaving the bareblock, there is no ambiguity about if @X might be needed, or used, subsequently. Some bloke looking at my code won't have to try to "figure that out" later.
But worst of all are global vars. To me, using those is like depending on a "side effect". As a min, declare them in main , but where needed, PASS THEM in as a ref or by value.
Just some musings about scope...
|