in reply to ref == "REF"

It makes sense that a reference to a reference returns REF and not just scalar.

If a reference to a referene would return 'SCALAR' then it will be hard to tell the difference between $x = "\3"; and $x = \\%hash;

About Data::Dumper, have you checked the Dumper.xs file aswell?

Replies are listed 'Best First'.
Re^2: ref == "REF"
by gaal (Parson) on Oct 18, 2004 at 18:05 UTC
    By that logic, you'd expect NUMBER and STRING return values to ref (or even INTEGERR, UNSIGNED, and DOUBLE)!

    I don't think it's harder. If you write recursive code to handle deep references, you just find out you have a reference one level deeper. Hey, maybe we should also have a REFREF value, too, and REFREFREF, ...

    As for Dumper.xs, I hadn't looked there, because my question was about Perl usage, which XS is not; it uses the perl API and uses SvTYPE directly. *That* bit of code never sees what ref would return on a variable.

      Not true,

      Since print $$reference (when ref $reference is SCALAR) will always output a value. When ref $reference is REF it will output SCALAR(0xXXXXXX).

      The particular code I had in mind is:

      $a = "xyz"; $b = \$a; $c = \$b; $d = $c; while (ref $d eq "REF") { $d = $$d; } $, = " & "; print ($a, $b, $c, $d, $dd);

      If you look at the output then $d will have the same value of $d

      What is different if there was no REF type, and you would need to have a reference (for whatever purpose) at the end of the while, then you will need to create a new reference which will not refer to the same scalar as $b:

      $a = "xyz"; $b = \$a; $c = \$b; $d = $c; while (ref $d eq "SCALAR" or ref $d eq "REF") { $d = $$d; } $, = " & "; $e = \$d; print ($a, $b, $c, $d, $dd, $e);

      $dd is ofcourse undefined, and $e refers to the scalar $d, not to $b. Which means you went one step to far in the iteration.

      I don't know wheter this is useful or useless since I haven't really needed it yet, but if I need it I sure will be happy to have it. Else that second loop would need some extra code...

        I hope I understand you correctly. If so, then wouldn't the expression

        ref $x eq 'SCALAR' && ref $$x

        suffice as an idiomatic substitute for the current

        ref $x eq 'REF'

        ?