> From: Bryan R Harris <[EMAIL PROTECTED]>
>>> Bryan R Harris wrote:
>>>> 
>>>> John W. Krahn wrote:
>>>>> 
>>>>> Bryan R Harris wrote:
>>>>>> 
>>>>>> John W. Krahn wrote:
>>>>>>> 
>>>>>>> The left hand side of the assignment determines context so the @l2r{...}
>>>>>>> part.
>>>>>> 
>>>>>> That strikes me as odd...  When perl goes to populate @l2r{"a","b"}, it
>>>>>> seems to me that it would go through this process:
>>>>>> 
>>>>>> - I have a slice here, so I'll loop over the slice elements
>>>>>> - The first is "a", so I'll pull a scalar off the list and assign it to
>>>>>> $l2r{"a"}
>>>>>> - The second is "b", so I'll pull another scalar off the list and assign
>>>>>> it
>>>>>> to $l2r{"b"}
>>>>>> - Remaining scalars in the list are discarded
>>>>> 
>>>>> Correct, except for the loop part.
>>>>> 
>>>>>> Why would $l2r{"a"} here be considered list context?
>>>>> 
>>>>> It isn't, unless it's written as ( $l2r{"a"} ), then it's a list with
>>>>> one element.
>>>> 
>>>> So I still don't understand what about @l2r{"a","b"} makes it evaluate the
>>>> first (<FILE>... in list context instead of scalar context.
>>> 
>>> The '@' sigil at the front of the variable name says that it is either
>>> an array or a slice and so it forces list context on the right hand side
>>> of the assignment.
>> 
>> I think it finally clicked!
>> 
>> It makes more sense to me that (<FILE>,<FILE>) is kind of the same thing as
>> saying (@a,@b).  In list context @a returns the array as a list, but in
>> scalar context @a returns the number of elements.  Obviously (@a,@b) returns
>> the union of the two lists, not two scalars.  "<FILE>" is treated the same
>> way.
> 
> Almost. It still depends on the left hand side. Try this:
> 
> @a = (10,20,30);
> @b = (40,50,60);
> 
> $s = (@a,@b);
> print "$s\n";
> #versus
> ($s) = (@a,@b);
> print "$s\n";
> 
> 
> In the first case the @a and @b are evaluated in scalar context. Even
> though they are enclosed in braces.

Dang!

But your example helped -- this one makes sense to me, at least:

perl -e '@a=(1,2,3);@b=(4,5,6,7);@l{1,2}=(@a,@b);print "$l{1}\t$l{2}\n";'

Should I think of this as:  ($l{1}, $l{2}) = (@a,@b)
?

If so, then that makes a lot more sense to me.

Thanks for helping me along on this one...

- Bryan




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


Reply via email to