But note that you are now responsible for manually syncronizing the variable you tie with the variable that gets untied. I would hide that with something like (untested):
sub lazy_init { tie $_[0], "MyGlobals", $_[1], \($_[0]); } # Then elsewhere lazy_init(my $baz3, "LegacyRoutines::baz"); print $baz3, "\n"; print $baz3, "\n";
If you are going to propagate bad, unmaintainable hacks, there is still no excuse to not try to identify and kill potential causes of error. With enough hacks you can even make it look halfway decent...

Of course it isn't really halfway decent. For instance if you avoid using the variable, you will have a memory leak. One solution is to manually untie somewhere. Of course that is something that can easily go wrong. With 5.6.x you can download and install WeakRef and use that to break the self-reference. For older versions of Perl you would need to untie. The cleanest safe way to do that is to return a ReleaseAction handle that will untie when it goes out of scope. Or you can play with the reference counts directly at the C level.

With all of that, I think you get a reliable implementation of this feature. I still don't like it though.


In reply to Re (tilly) 2: You can hack anything... by tilly
in thread Using tie to initialize large datastructures by htoug

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.