Note that this took place within a single procedure and yep the variable names were nice and descriptive. The problem is that I didn't spot the extra 'my' lower down and so missed the reclaration.
I cannot imagine a case where I personally would want to use this language feature and so would like to be warned about it whenever I do this in my code.
Comments about variable naming etc do not help me.
Thx | [reply] |
"I cannot imagine a case where I personally would want to use this language feature ..."
Well, for one, this feature is extremely useful when
'slurping' an entire file into a scalar. To do this, you
must set $/ to an undefined value, but doing that
could break client code. By only 'reseting' that variable
inside a 'bare block', you guarantee that you will not
break someone's client code that might use yours. In
action, instead of using:
my $data;
while (<FILE>) {
$data .= $_;
}
I can safely 'turn off' $/ temporarily via
local:
my $data = do {local $/ = undef;<FILE>};
# $/ contains it's original value (\n) now
But ... i have been coding Perl for a good solid 4 years
now. Your milleage may (and will) vary. I hope you decide
to stick around, because we have lots of useful information
for you. We just sometimes have to question why someone
would even want to do something like this, that's all. :)
jeffa
L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)
| [reply] [d/l] [select] |
Not to make any assumptions, but how long is the sub, where did you originally declare the variable, how far away is its first use, and how far away the redeclaration? I'm just curious because I've never come across this problem and can't imagine it taking me hours to spot.
I generally declare variables right when I use them the first time, and scope them tightly, trying to declare them in the innermost of the blocks they're used in. My code blocks are as short as I can keep them - a screenfull is long, more than two is under most circumstances too much. As a result, there's very rarely any occasion where a variable name is declared further than a screen from where it goes out of scope.
For all intents and purposes these habits make it impossible to blunder in ways like this. Of course I may be way off mark, but it simply puzzles me that anyone would have this kind of trouble. My personal experience suggests it's just not possible to overlook duplicate declarations with habitual tight scoping and late declaration. YMMV of course.
Makeshifts last the longest.
| [reply] |