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