Мало того, что символическая ссылка здесь очень плохая идея, она даже не решает вашу проблему. Вы создаете выражение в $key2
, и простое засовывание еще одного знака доллара перед его именем не заставит Perl выполнить этот код. Для этого вам понадобится eval
, что является еще одной плохой идеей
Вы можете установить и использовать модуль Data::Diver
, который делает именно такие вещи, или вы можете просто перебрать список ключей хеша, каждый раз выбирая новую ссылку на хеш и присваивая значение элементу с помощью последний ключ
Самая большая проблема - это анализ входящей строки в списке ключей и значения. Этот код реализует подпрограмму apply
, которая применяет подразумеваемую операцию в строке к вложенному хешу. Если вы не уверены в своих данных, необходимо добавить проверку ошибок, чтобы убедиться, что каждый из ключей в списке существует. Вывод Data:;Dumper
предназначен только для подтверждения правильности результата
use strict;
use warnings 'all';
use Data::Dumper;
my $inst = { 'banana' => 2, 'guava' => 3, 'apple' => { 'mango' => { 'orange' => 80 } } };
my $s = 'apple.mango.orange = 100';
apply($s, $inst);
print Dumper $inst;
sub apply {
my ($operation, $data) = @_;
my ($keys, $val) = $operation =~ /([\w.]+)\s*=\s*(\d+)/;
my @keys = split /\./, $keys;
my $last = pop @keys;
my $hash = $data;
$hash = $hash->{$_} for @keys;
$hash->{$last} = $val;
}
выход
$VAR1 = {
'banana' => 2,
'apple' => {
'mango' => {
'orange' => '100'
}
},
'guava' => 3
};