my (%hash); $hash{'id1'} = "1"; doSub1(\%hash); # the return id2 should be changed within doSub2 when doSub1 call it. print "$hash{'id2'}\n"; doSub1 { # accept param as hash by reference my ($hrec_ref) = @_; $$hrec_ref{'id2'} = "0"; # Going to call doSub2 by passing Only $$hrec_ref{'id2'} as reference. # Because $hrec_ref is a hash reference already, How I can call it? # doSub2(\$hrec_ref{'id2'}); Return Error. Not valid. # doSub2($hrec_ref{'id2'}); Also return Error. } doSub2 { # handle only a single string param by reference my ($href) = @_; $$href = "value changed in doSub2"; } #### #... inside doSub1 my ($s) = $$hrec_ref{'id2'}; doSub2(\$s); $$hrec_ref{'id2'} = $s;