use warnings; use strict; use Data::Dump 'dd'; use Storable 'dclone'; my $hr = { foo => { bar => "quz" } }; my $deep = dclone($hr); $deep->{foo}{bar} = 'baz'; $deep->{x} = 'y'; dd $deep; # { foo => { bar => "baz" }, x => "y" } dd $hr; # { foo => { bar => "quz" } } unchanged my $shallow = { %{ $hr } }; $shallow->{foo}{bar} = 'baz'; $shallow->{x} = 'y'; dd $shallow; # { foo => { bar => "baz" }, x => "y" } dd $hr; # { foo => { bar => "baz" } } # original changed ^^^