Ответ 1
Оператор delete
возвращает удаляемое значение. Итак, это
$data->{key3}{key4}{key6} = delete $data->{key3}{key4}{key5}
сделает то, что вы ищете.
Скажем, если у меня есть такой хэш:
$data = {
'key1' => {
'key2' => 'value1'
},
'key3' => {
'key4' => {
'key5' => 'value2'
}
},
};
Теперь, как я могу заменить ключ "key5" другим ключевым именем, скажем, "key6"? Я знаю, как перебирать хэш и выгружать значения, но я не знаю, как заменить ключи или значения на месте. Благодарим за помощь.
Оператор delete
возвращает удаляемое значение. Итак, это
$data->{key3}{key4}{key6} = delete $data->{key3}{key4}{key5}
сделает то, что вы ищете.
Вы не можете его заменить, но вы можете легко сделать новый ключ, а затем delete()
старое:
$data->{key3}{key4}{key6} = $data->{key3}{key4}{key5};
delete $data->{key3}{key4}{key5};
Конечно, вы можете сделать довольно простую подпрограмму для этого. Однако мой первый подход был неправильным, и вам нужно будет сделать более сложный подход, который проходит в структуре данных для модификации, и элемент, который нужно изменить, и учитывая, что вам нужны элементы на несколько уровней, это может быть сложно. Хотя, если вы не возражаете против небольшого беспорядка:
sub hash_replace (\%$$) {
$_[0]->{$_[2]} = delete $_[0]->{$_[1]}; # thanks mobrule!
}
Затем назовите его:
hash_replace %{$data->{key3}{key4}}, "key5", "key6";
Или крутой способ (Как лучше сказать, что мы трансформируем "ключ5" в "ключ6"?):
hash_replace %{$data->{key3}{key4}}, key5 => "key6";
(Протестировано и работает)
вы можете использовать YAML для глубокого погружения в ваш хэш с простым регулярным выражением:
use YAML::XS;
my $yaml = Dump $hash;
$yaml =~ s/key5/key6/; # may wish for global sub
$hash = Load $yaml;
Это "работает", но очень жестко закодировано.
#!/bin/perl -w
use strict;
my $data = {
'key1' => {
'key2' => 'value1'
},
'key3' => {
'key4' => {
'key5' => 'value2'
}
},
};
print "$data->{key3}->{key4}->{key5}\n";
my $save = $data->{key3}->{key4}->{key5};
delete $data->{key3}->{key4}->{key5};
$data->{key3}->{key4}->{key6} = $save;
print "$data->{key3}->{key4}->{key6}\n";
Вы можете устранить операции "- > " между индексами хеширования, но не после "$ data" - как в решении Криса Лутца.