Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Cloning (weak) references

by Tomte (Priest)
on Mar 03, 2005 at 15:19 UTC ( #436239=perlquestion: print w/replies, xml ) Need Help??
Tomte has asked for the wisdom of the Perl Monks concerning the following question:

In comp.lang.perl.misc it was asked (message-ID: <>)

I've tried various cloning modules to clone a structure containing weak references.
use Storable 'dclone'; use Scalar::Util qw(weaken isweak); my $x = 99; my $y = [ \$x ] ; weaken $y->[0]; $z = dclone $y; print "y: ", isweak $y->[0]; print "z: ", isweak $z->[0];
This prints: y: 1 z: I've tried it using the Clone module and Clone::PP. Clone::PP does the same as Storable. Clone gives a segmentation fault. I'm using Perl 5.8.0 on Linux 2.4.20-8
my reply is
After a little bit of thought I'd say that's normal, to be expected behaviour: You're not cloning the weakend reference, but the the data it references, the reference in z[0], poiting to the clone of $x, is a completly new one, the data is cloned, not the reference. I may misunderstand the behaviour though...hmmm kind regards, Tom

Now I'm curious: Am I right? And if I'm right: Is it possible to clone references (Update preserving their "weakend-state")?


An intellectual is someone whose mind watches itself.
-- Albert Camus

Replies are listed 'Best First'.
Re: Cloning (weak) references
by hardburn (Abbot) on Mar 03, 2005 at 15:27 UTC

    I think you're correct. To fix, the clone operation would have to ensure the ref count stays the same, but I don't think that is the right thing to do in the general case. Cloning means you have an extra something that is making a reference to your data, and that extra something means an additional ref count.

    "There is no shame in being self-taught, only in not trying to learn in the first place." -- Atrus, Myst: The Book of D'ni.

Re: Cloning (weak) references
by simonm (Vicar) on Mar 03, 2005 at 22:15 UTC
    You could easily extend Clone::PP to do this, by adding a line to the elsif ($ref_type eq 'REF' ... section, something like weaken( $copy = $source ) if isweak( $source );.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://436239]
Approved by Corion
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (4)
As of 2018-04-20 05:18 GMT
Find Nodes?
    Voting Booth?