$ perl -wMstrict -MData::Dumper -le 'my (%x,%y) = (1,2,3,4); print Dumper(\%x,\%y)' $VAR1 = { '1' => 2, '3' => 4 }; $VAR2 = {}; #### use warnings; use strict; use Data::Dump 'pp'; my %x = ("a" => "red"); my %y = ("b" => "green"); my %z = ("c" => "black"); pp \%x, \%y, \%z; my ($r1, $r2, $r3) = modfifyHash(\%x, \%y, \%z); pp $r1, $r2, $r3; pp \%x, \%y, \%z; # these remain unmodified sub modfifyHash { #my ($x, $y, $z) = @_; # this would modify the original hashes my ($x, $y, $z) = map { { %{ $_ } } } @_; # ^ ^ ^ # | | for each argument # | dereference as hash # make new hash reference (shallow copy!) $x->{a} = "circle"; $y->{b} = "square"; $z->{c} = "rectangle"; return $x, $y, $z; } __END__ ({ a => "red" }, { b => "green" }, { c => "black" }) ({ a => "circle" }, { b => "square" }, { c => "rectangle" }) ({ a => "red" }, { b => "green" }, { c => "black" })