> 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/