in reply to Re: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object? (design decisions)
in thread Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?

Thanks. But what do you mean by "symbols for references?" Are you referring to something like this: Symbolic references?

$PM = "Perl Monk's";
$MC = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar Parson";
$nysus = $PM . ' ' . $MC;
Click here if you love Perl Monks

  • Comment on Re^2: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?

Replies are listed 'Best First'.
Re^3: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?
by LanX (Saint) on Jan 21, 2024 at 16:59 UTC

    A unique textual identifier for each object. A name following rules and closely coupled to an object.

    To get the actual reference, you'll call a class method like My::File->get_obj(symbol) to lookup in %My::File::instance

    That's the "weakest" way...

    Update

    This allows to designs systems where warnings like "object (File/Directory) doesn't exist anymore" are possible. Think inodes!

    Also keep in mind that Perl can reuse refs for new variables after destructions, tho I doubt this happens when there is still a weakened ref around. (?)

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    see Wikisyntax for the Monastery

      Also keep in mind that Perl can reuse refs after destructions, tho I doubt this happens when there is still a weakened ref around. (?)

      If all the strong refs to an object go away, it gets freed; there is nothing stopping the memory being reused after that.

      When a reference is weakened, a flag is set on the reference, and a record of the reference is added to a list of weakrefs attached to the object (stored under PERL_MAGIC_backref magic). When the object gets freed, it uses that list to set the affected weakrefs to undef to keep things safe.

      Note that the weakrefs are stored as a simple list, so freeing a weakref can get expensive when an individual object has many weakrefs to it: it has to do an O(n) scan of the list to find the entry to remove, so removing all of the weakrefs individually is O(n^2) whereas removing them in one go by freeing the object is O(n).

        Thanks, that sounds like the good design I expected. 👍🏼

        Apart from the note about the complexity of long lists, but yeah having tons of weak refs is hopefully only a rare edge case. :)

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        see Wikisyntax for the Monastery

        update

        See also perlref#Circular-References