On 24 Sep 2002 05:21:37 -0400, Aaron Sherman wrote: > On Tue, 2002-09-24 at 01:46, Trey Harris wrote: > > sub push(@target is rw, *@list); > > Well, yes, but that wasn't the point. The C<*@list> will force array > flattening, thus > > push @a, [1,2,3], 4; > > will (according to Larry's stated desire to unify arrays and references > to arrays in terms of behavior) result in four elements getting pushed > onto C<@a>, not two.
But the decision on how arguments get passed happens at compile time, not run time. At that point we can tell the difference between an explicit arrayref and a flattened array: push @a,1,2,3; # 1 - list push @a,(1,2,3); # 2 - list push @a,[1,2,3]; # 3 - scalar push @a,@b; # 4 - list push @a,*@b; # 5 - list push @a,\@b; # 6 - scalar push @a,[@b]; # 7 - scalar 1 and 2 are the same; parens in a list don't have any effect, and push receives three elements in its @list parameter. 3 is an explicit arrayref so gets passed as a single scalar. This is a simple and obvious distinction for the programmer to make. 4 and 5 are the same due to the *@ prototype; push receives the contents of @b in its @list parameter. 6 is an explicit arrayref, so that's what push gets given. I would argue that 7 is like 6, except that it copies @b's elements. -- Peter Haworth [EMAIL PROTECTED] Reporter: Mr Gandhi, what do you think of Western Civilization? Gandhi: I think it would be a good idea.