sub save_state { my %save_hash; # foreach is your friend foreach $key (keys (%main_hash)){ foreach $num1 (0..$#{$main_hash{$key}}){ foreach $num2 (0..$#{$main_hash{$key}[$num1]}){ # Now we are far enough down to copy the values $save_hash{$key}[$num1][$num2] = $main_hash{$key}[$num1][$num2]; } } } my @save_info; push(@save_info,\%save_hash); push(@save_info,\$aVar); # etc. for all vars to save push(@save_stack,\@save_info); }