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

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

  • Comment on Re^3: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?
  • Select or Download Code

Replies are listed 'Best First'.
Re^4: Should I use weaken on an object attribute containing a reference to an object which contains reference back to original object?
by hv (Prior) on Jan 21, 2024 at 18:33 UTC

    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