in reply to Re^5: Reference of constants and literals
in thread Reference of constants and literals

let's get back to the roots:

> > You never pass an array or hash, just references to them. It's not even possible to pass arrays or hashes to subroutines.

> Thats a matter of interpretation,

The closest you can get to "passing an array" in perl is to pass the arr_ref. Thats my interpretation of passing, (and not only mine)

So what do you mean with "It's not even possible to pass arrays or hashes to subroutines." What else could be considered passing an array, which is not possible in perl???

Cheers Rolf

  • Comment on Re^6: Reference of constants and literals

Replies are listed 'Best First'.
Re^7: Reference of constants and literals
by ikegami (Patriarch) on Nov 24, 2008 at 16:37 UTC

    What else could be considered passing an array, which is not possible in perl???

    You've equated passing with sending (push @a), but that's only half it. For something to be passed successfully, it must also be received.

    Many languages (including C++, various BASIC derivatives and Java) allow arguments that are arrays. Perl isn't one of them. One must usually go through the extra step of getting a reference in the caller, and one always must go through the extra step of dereferencing in the callee.

    The closest you can get to "passing an array" in perl is to pass the arr_ref. Thats my interpretation of passing, (and not only mine)

    It seems I have to repeat myself. I'm not disputing that foo(\@a) can also be considered passing an array, but that's off topic.

    Whatever you want to call it, $_[0] will never be an array. Therefore, \$_[0] will never be a reference to an array.

    My point was that while you were saying that references to arrays do one thing and references to scalars do another, the code you were using only dealt with references to scalars.

    What's your point? I don't see how any of what you've said concerning passing arrays relates to the subject at hand.

      > What's your point?

      None left, I was wrong. I was overlooking errors in the results, -> Re^6: Reference of constants and literals leading to inconsistency in perl.

      anyway I think it's a notable result of this discussion that the location of constants and literals will not be fixed at compiletime!

      I made an update to the root-post.

      Cheers Rolf

        (Upd: I didn't take into account that \1 is a constant itself. Please ignore this post )

        anyway I think it's a notable result of this discussion that the location of constants and literals will not be fixed at compiletime!

        That's not true. Constants are allocated once at compile time.

        for (1..3) { print(\1, "\n"); push @x, 'x'; # Prevent reuse of memory addresses. }
        SCALAR(0x236d94) SCALAR(0x236d94) SCALAR(0x236d94)

        They are tied to the opcode, and the same constant is returned every time.

        PP(pp_const) { dVAR; dSP; XPUSHs(cSVOP_sv); RETURN; }

        If you see otherwise, it's because you're looking at a *copy* of the constant.

        Note that different instances of the same literal results in different constants.

        for (1..3) { print(\1, ' ', \1, "\n"); push @x, 'x'; # Prevent reuse of memory addresses. }
        SCALAR(0x236d94) SCALAR(0x183179c) SCALAR(0x236d94) SCALAR(0x183179c) SCALAR(0x236d94) SCALAR(0x183179c)