Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

Re^4: Unable to make shallow copy of Moo hash ref attribute

by davido (Cardinal)
on Nov 14, 2018 at 16:10 UTC ( #1225804=note: print w/replies, xml ) Need Help??

in reply to Re^3: Unable to make shallow copy of Moo hash ref attribute
in thread Unable to make shallow copy of Moo hash ref attribute

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.


Replies are listed 'Best First'.
Re^5: Unable to make shallow copy of Moo hash ref attribute
by nysus (Vicar) on Nov 17, 2018 at 09:37 UTC

    Thanks. local is one of those keywords that you'll often read about but rarely stop to think when it can be used when you are actually writing code.

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

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1225804]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (12)
As of 2019-05-23 17:19 GMT
Find Nodes?
    Voting Booth?
    Do you enjoy 3D movies?

    Results (146 votes). Check out past polls.

    • (Sep 10, 2018 at 22:53 UTC) Welcome new users!