... # populate your %project readItem(\%project); ... sub readItem { my ($project) = @_; my $sub_project = $project->{...}->{...}; etc. } #### my %multi_level = ( 'foo' => { 1 => 'A', 2 => 'B' }, 'bar' => { 'C' => 'see', 'T' => 'tea' }, ); my $sub_part = $multi_level{foo}; # sub_part is a hashref, # also pointed at by $multi_level{foo} print $multi_level{foo}->{1} . "\n"; # works (prints 'A') $sub_part->{3} = 'C'; print $multi_level{foo}->{3} . "\n"; # works (prints 'C') my $part_two = $multi_level{foo}->{1}; # part_two is a # scalar, a copy of the value of $multi_level{foo}->{1}, # namely 'A'. Changing it will not change %multi_level #### my $a = 'blah'; my $b = $a; $b = 'foo'; print "$a\n"; # prints 'blah' print "$b\n"; # prints 'foo'