Sometimes a picture paints a thousand words, so here's a contrived example of what I'm getting at with respect to using local to allow changes to a data structure without letting those changes propagate outward (as a possible alternative to the thought "I need to clone this."):

use Data::Dumper; $Data::Dumper::Sortkeys = 1; $Data::Dumper::Indent = 0; my $args = { foo => 1, baz => 2, }; print "Before calling mysub(\$args)\n"; print Dumper($args), "\n\n"; mysub($args); print "After calling mysub(\$args)\n"; print Dumper($args), "\n\n"; sub mysub { my $args = shift; local $args->{'foo'} = $args->{'foo'}; $args->{'foo'} += 100; # 101 now. print "Inside mysub()\n"; print Dumper($args), "\n\n"; othersub($args); } sub othersub { my $args = shift; local $args->{'baz'}; delete $args->{'baz'}; print "Inside othersub()\n"; print Dumper($args), "\n\n"; }

This produces the following output:

Before calling mysub($args) $VAR1 = {'baz' => 2,'foo' => 1}; Inside mysub() $VAR1 = {'baz' => 2,'foo' => 101}; Inside othersub() $VAR1 = {'foo' => 101}; After calling mysub($args) $VAR1 = {'baz' => 2,'foo' => 1};

So with local we've been able to make changes to individual elements within the $args data structure without those changes propagating back out to the caller's data structure. In cases where the number of changes is small, you can use this sort of strategy rather than deep cloning the entire structure. However, there certainly are many legitimate uses for a deep clone, and the localization of structure elements is not the right tool for every situation. I just wanted to present it as one tool that may be useful in some cases.


Dave


In reply to Re^4: Unable to make shallow copy of Moo hash ref attribute by davido
in thread Unable to make shallow copy of Moo hash ref attribute by nysus

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.