Is this good practice?

I don't see anything directly wrong with it. It's just not clear to me from what you write whether some other construct might be more fitting in your situation. Maybe this is an XY Problem - what exactly are you trying to achieve by "caching" the config hashref like this? How do you want your code to behave when individual config values are changed, or the entire config is replaced?

state $cfg never gets re-initialized, so it will always refer to the same hash, and cfg_cache() will always return that same hashref. The contents of the config hash being referred to can still be freely manipulated by anyone holding a reference to the original hash (that's what you're seeing when your code prints "mouse") or anyone calling cfg_cache().

Perhaps you have over-simplified your example code a bit but I don't see the difference between your method and using a (readonly) global variable?

If you're interested in protecting the config hash against (accidental) changes, see Readonly and/or lock_keys from Hash::Util.


In reply to Re: caching hashrefs in state by Anonymous Monk
in thread caching hashrefs in state by agname

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.