http://www.perlmonks.org?node_id=173987


in reply to Re: Function Prototype Context Conversion
in thread Function Prototype Context Conversion

No, that much is clearly understood. What I mean is that with respect to function prototypes, passing an array to a scalar prototype would seem to be a type mismatch, although these are kind of relative in such a loosely typed language as Perl. You'd hope for a warning, perhaps. You've asked for a scalar, but you're getting a list.

What I was expecting was that the @foo array would be expanded into the brackets in the function call and passed through as a list, but Perl appears to be doing some truly clever things to try and handle the prototype, taking it to the ultimate extreme.

Update:
japhy and everyone else who has been kind enough to post remarks on this subject is 100% correct, of course. What led to this insight into prototypes was one part ass, one part you, one part me, and we all know what that adds up to.

The counter-intuitive component of this is that I'd expected an automatic array-to-list conversion to be peformed before said list is then passed to the prototype, but this is not the case. A list of an array is not the same as a list of the array elements.
  • Comment on Re^2: Function Prototype Context Conversion

Replies are listed 'Best First'.
Re: Re^2: Function Prototype Context Conversion
by japhy (Canon) on Jun 12, 2002 at 20:48 UTC
    tadman: You've asked for a scalar, but you're getting a list.

    Ah, not so! You've ask for a scalar, but you're getting an array! If you had done:

    sub foo ($) { ... } @a = (1,10,100); foo(@a); # no error, '3' is passed to foo() foo(1,10,100); # error, too many args
    you'd have seen. Arrays and lists are not the same thing.

    _____________________________________________________
    Jeff[japhy]Pinyan: Perl, regex, and perl hacker, who'd like a job (NYC-area)
    s++=END;++y(;-P)}y js++=;shajsj<++y(p-q)}?print:??;