my $val = \%hash;
$val //= $val->{$_} for @key;
say $val;
или вы можете использовать Data :: Diver
use Data::Diver qw( Dive );
say Dive(\%hash, @key);
Ни одна из версий не оживет, если какая-либо часть ключа не существует.
Если вы хотите установить значение с помощью такой клавиши:
my $p = \\%hash;
$p = \( $$p->{$_} ) for @key;
$$p = 5;
или
use Data::Diver qw( DiveRef );
my $ref = DiveRef(\%hash, map \$_, @key);
$$ref = 5;
или
use Data::Diver qw( DiveVal );
DiveVal(\%hash, map \$_, @key) = 5;
(map \$_,
требуется, чтобы Data :: Diver делал хэши вместо массивов для цифровых клавиш.)