[JOB] Perl Software Developer and Database programmer

Tim Sweetman ti at lemonia.org
Wed Feb 22 23:28:41 GMT 2006


Lusercop wrote:

>On Wed, Feb 22, 2006 at 05:39:50PM +0000, Andy Armstrong wrote:
>  
>
>>On 22 Feb 2006, at 17:08, Lusercop wrote:
>>    
>>
>>>In which case, why are you needing to localise it? Any situation where
>>>you need to localise it means that the scope of it is too large.
>>>      
>>>
>>it's nice to be able to write subs that look map or grep - which  
>>means not trashing $_.
>>    
>>
If you have to do something like this:
local $_ = 'house'; # tell the wolf what to blow down
Bad::Wolf::BlowDown("very forcefully");

... then that's passing parameters via $_, and is obviously a ghastly 
hack and silly, and should cause maintenance programmers to shout, a 
lot, and rudely.

On the other hand, localising $_ from inside a function, so that 
function can be called without tipping over the caller's $_, does no 
damage to the program's structure. In fact, Lusercop seems to be 
criticising a function for NOT using global variables.
And that's ridiculous.

>
>But not necessary. And the hacks to do it can sometimes be not worth the
>pain.
>
>  
>
>>>I'd humbly suggest that this "makes the code more fragile", but perhaps
>>>I'm just talking as someone whose main commercial programming experience
>>>up to a year ago was maintenance programming.
>>>      
>>>
>>This from the man who suggested faking |local| using |my| and ended  
>>up with less robust, more obscure code :)
>>    
>>
>
>Er, no. I suggested not using globals, but if you absolutely HAD to use
>globals then doing it explicitly. And I think it's less obscure.
>  
>
Actually, you said

>I can
>imagine a very good software engineer who doesn't understand the difference
>between [local and my], because he's never had to use local, all his/her code is
>reentrant and doesn't use globals which need localising.
>
Which is fair enough. Minimise coupling. That's why we aren't using BBC 
Basic, right? Though that last bit could be read as either (a) "has no 
global variables at all, so using 'local' is unnecessary and useless", 
or (b) "doesn't use any globals which would cause strange interactions 
during re-entrancy, so there are globals in it but 'local' is 
unnecessary". I suspect you meant (a), but that's with hindsight.

THEN, you said:

>If, on the other hand, you want a software
>engineer, then a candidate knowing that local exists and that it's almost
>always the wrong answer is still in the running. As I said elsewhere in
>this thread. (and given that you can simulate the effects of local with a
>more explicit set of mys, in a much clearer way, then this is also true).
>
The "much clear way" turned out to be:

>{
>   my $newdollarslash = "whatIwant";
>   my $savdollarslash = $/;
>   $/ = $newdollarslash;
>
>   dostuffwithappropriatecalls();
>
>   $/ = $savdollarslash;
>}
>


Andy then described you, the lusercop, as "the man who suggested faking 
|local| using |my| and ended  up with less robust, more obscure code".

To which lusercop says:

>Er, no. I suggested not using globals, but if you absolutely HAD to use
>globals then doing [so] explicitly [by shunting values into 'my' variables].
>
That's "yes", not "no".

FWIW, Damian Conway's "Perl Best Practices" (Chapter 5, p. 77) says:
"If you're forced to modify a package variable. localize it... 
Occasionally you will have no choice but to use a package variable, 
usually because some other developer has made [it part of a module's 
interface... using local is a much more neighbourly approach than 
setting your value & leaving it]".

HTH

ti'



More information about the london.pm mailing list