Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re^3: ref == "REF"

by Anonymous Monk
on Oct 18, 2004 at 20:31 UTC ( [id://400311]=note: print w/replies, xml ) Need Help??


in reply to Re^2: ref == "REF"
in thread ref == "REF"

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...

Replies are listed 'Best First'.
Re^4: ref == "REF"
by gaal (Parson) on Oct 18, 2004 at 20:39 UTC
    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'

    ?

      Thinking about it some more made me realize that ref $x eq 'REF' can be used more efficiently then ref $x eq 'SCALAR'. (Although not really on the previous code, since the goal was to keep one reference at the end)

      If you have ref $x eq 'REF' then you know that the scalar to which $x refers to is yet another reference, so noone stops you from doing $x = $$$x;, which avoids yet another call to the ref function...

      Yes it would.

      But then you are doing two calls to ref instead of one...

      But then another question would be, which one would be the most efficient? (assuming the perl-interpreter does not return REF (and doesn't do any check on it))

        The current behavior would be the more efficient one. But it is also less clean, conceptually, so (I'm come to conclude) it shouldn't belong in the ref builtin.

        This doesn't matter, though. It is a *very simple extension* to add this feature outside core perl. Something along the lines of:

        use Inline C => << "EO_REFREF"; int refref(SV* thing) { return SvROK(SvRV(thing)); } EO_REFREF
        (This is not anywhere near tested, though :)

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://400311]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (4)
As of 2024-04-25 22:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found