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.
|