use Data::Dumper;
my $my_hash_ref = { a => { b => { c => 2 } } };
my @k = qw( a b c );
my $r = $my_hash_ref;
$r = $r->{$_} foreach @k;
$r = 3;
print Dumper($my_hash_ref);
# { 'a' => { 'b' => { 'c' => 2 } } };
####
use Data::Dumper;
my $my_hash_ref = { a => { b => { c => 2 } } };
my @k = qw( a b c );
my $p = \$my_hash_ref;
$p = \($$p->{$_}) foreach @k;
$$p = 3;
print Dumper($my_hash_ref);
# { 'a' => { 'b' => { 'c' => 3 } } };
####
my @k = qw( a b c );
$my_hash_ref->{$k[0]}->{$k[1]}->{$k[2]} = 2;
my $r = $my_hash_ref;
$r = $r->{$_} foreach @k;
$r = 3;
print($my_hash_ref->{$k[0]}->{$k[1]}->{$k[2]}, "\n"); # 2
####
my @k = qw( a b c );
$my_hash_ref->{$k[0]}->{$k[1]}->{$k[2]} = 2;
my $p = \$my_hash_ref;
$p = \($$p->{$_}) foreach @k;
$$p = 3;
print($my_hash_ref->{$k[0]}->{$k[1]}->{$k[2]}, "\n"); # 3