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

> 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

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

Replies are listed 'Best First'.
Re^9: Reference of constants and literals
by ikegami (Patriarch) on Nov 24, 2008 at 17:14 UTC
    (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

        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?

        1 is a constant. \ takes a reference.

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

        I didn't speculate or investigate what a copy would be made.

        However, I made a mistake. I forgot to take into account that \1 is a constant itself.

        >perl -MO=Concise -e"$x = \1" 6 <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 -e:1) v ->3 5 <2> sassign vKS/2 ->6 3 <$> const[RV \1] s ->4 <----- - <1> ex-rv2sv sKRM*/1 ->5 4 <#> gvsv[*x] s ->5 -e syntax OK

        My conclusion was based on observed results, which were based on a faulty assumption. Please ignore.

        On the plus side, it's a simple of way of generating a unique id for a spot in a file! Isn't that what you were after? It's not clear how you'd find out which spot is associated with which id, though.