Jenda Krynicky wrote:
> From: Rob Dixon <[EMAIL PROTECTED]>
>> Jenda Krynicky wrote:
>>> From: "Dr.Ruud" <[EMAIL PROTECTED]>
>>>> "Jenda Krynicky" schreef:
>>>>> Rob Dixon:
>>>>>>
>>>>>>   local $" = ',';
>>>>>>   print "@array\n";
>>>>>
>>>>> print join(',', @array), "\n";
>>>>>
>>>> is much cleaner and safer. Leave $" alone.
>>>> I don't agree. It is totally fine to use a local-ed $", if it is inside
>>>> a minimal block.
>>>
>>> Is it? What if the array you're gonna print is tie()d? Maybe it is 
>>> not now, but what if it becomes later? To share the array between 
>>> threads/processes, to store it on disk, to ...
>>>
>>> If there was no simple and clear way to print the array with a 
>>> specific delimiter, I'd say go ahead. But there is. A way that's much 
>>> easier to understand. Without having to know about an obscure builtin 
>>> variable that affects the way arrays are interpolated into strings.
>> A program with arrays that are tied in one place and not in another has 
>> bigger
>> problems than this anyway. 
> 
> I'm not talking about the program having one array tied and not tied 
> in various places. I'm talking about a program that evolves so that 
> an array that wasn't tied in the first version, is tied in a later 
> one. Because it grew too big to fit in memory, because you started 
> using several threads/processes, because ....
> 
>> But I don't see a problem with using $" with tied
>> arrays, unless the tied class happens to overload stringification.
> 
> Nope. Unless the tied class interpolates an array into a string 
> expecting to get the elements separated by spaces somewhere in the 
> methods invoked by reading the whole array. Or any of the functions 
> used in the methods does.

Ah I see. Because the tied class's FETCH method inherits the state of $"

It's something I hadn't thought of. But I don't buy it, because in this instance
I reckon it's for the module to protect against mishaps rather than being the
calling code's responsibility, becuase:

- $" applies specifically to arrays

- It's not unlikely to have been set in exactly the context that I wrote about

- It's very unlikely to be of any use in a tied class FETCH method

>>   print join(',', @array), "\n";
>>
>> is a lot noisier and IMO clumsier than
>>
>>   {
>>     local $" = ',';
>>     print "@array\n";
>>   }
>>
>> and after all, even if you don't know what $" does it's very simple to look 
>> it
>> up and also easy to remember.
> 
> 31 characters with no special variables vs. at least 42 chars with 
> one special variable affecting another statement?

Character count has less bearing on noise than pattern and uniformity.

  PLEEEEEEEEEEEEEEASE

is easier to read than

  VBGQ

> "Print the @array joined by commas and a newline." vs "Start a block. 
> In this block the items of any array interpolated into a string are 
> to be separated by commas. Now print the @array interpolated into a 
> string (viz above) followed by a newline. And now please forget we 
> changed the way arrays are interpolated in string."

That is just silly. You know very well that I could provide an even
longer-winded description of your code.

> Sure you can look up $", but why? The join() is clear without looking 
> anything up.

So I presume you also advocate keeping an independent input line count instead
of using $.? It would certainly be clearer in the same sense.

> And assuming Perl 5.10 we might even be comparing
> 
> say join(',', @array);
> 
> vs
> 
> {
>   local $" = ',';
>   say "@array";
> }
> 
> I wonder how long would it take before someone decides that the 
> quotes are not needed and changes that to
> 
> {
>   local $" = ',';
>   say @array;
> }

Again, that is just silly. "@array" is different from @array regardless of the
use of $".

Rob

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to