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

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.

Replies are listed 'Best First'.
Re^8: Reference of constants and literals
by LanX (Saint) on Nov 24, 2008 at 16:57 UTC
    > 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)

        I have to admit, I don't understand your code, I know \1 in the context of RegEx but otherwise couldn't find any reference for it in the docs. do you have a link, please?

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

        $_[0] is supossed to be an alias to the parameter

        DB<1> sub pr { print \$_[0] } DB<2> $a="x" DB<3> print \$a SCALAR(0x852b11c) DB<4> pr $a SCALAR(0x852b11c)

        Or do you mean that aliased symbols of variables in perl don't neccessarily have the same reference?

        I suppose this can possibly be done with typeglogs ... do mean this or a similar mechanism?

        Cheers Rolf