Luke Palmer <[EMAIL PROTECTED]> writes: > On 7/26/05, Ingo Blechschmidt <[EMAIL PROTECTED]> wrote: >> Hi, >> >> are the following assumptions correct? >> >> sub foo ([EMAIL PROTECTED]) { @args[0] } >> >> say ~foo("a", "b", "c"); # "a" > > Yep. > >> my @array = <a b c d>; >> say ~foo(@array); # "a b c d" (or "a"?) >> say ~foo(@array, "z"); # "a b c d" (or "a"?) > > "a" for both of these. The *@ area behaves just like Perl 5's calling > conventions. I could argue for never auto flattening arrays, but then > there'd really be no difference between @ and $. > >> say ~foo([EMAIL PROTECTED]); # "a" >> say ~foo(*(@array, "z")); # "a" > > Hmm, *(@array, "z")... what does that mean? Whatever it means, you're > correct in both of these. In the latter, the @array is in a > flattening context, so it gets, well, flattened. > >> sub bar ([EMAIL PROTECTED]) { [EMAIL PROTECTED] } >> >> say bar(1,2,3); # 3 >> say bar(@array); # 1 (or 4?) > > 4
Wha? And I mean that sincerely. That's cockeyed. Surely a [EMAIL PROTECTED] in the signature simply says 'gather up the rest of the args and stick 'em in this list'. In this case @array is a single argument, so @args should be equal to [EMAIL PROTECTED] If I'm calling the function and I want @array to be treated as anything but a single argument I use [EMAIL PROTECTED] >> say bar(@array, "z"); # 2 (or 5?) > > 5 Double wha? That's even worse. Do you claim that say bar('z', @array) also emits 5? Ick. >> say bar([EMAIL PROTECTED]); # 4 > > Yep. So how *do* I pass an unflattened array to a function with a slurpy parameter?