У меня есть произвольная структура данных. Форма обычно схожа в том, что она состоит из массивов и хэшей глубиной около четырех уровней, с примерно двумя-шестью значениями, которые я бы хотел изменить. Типичный пример:
$VAR1 = [
undef,
[
{
'0' => 'some string'
}
],
undef,
[
undef,
{
'1033' => 'another string '
}
]
];
Хотя я знаю синтаксис достаточно хорошо, чтобы получить доступ к этим двум значениям и изменить их в этом конкретном примере (или любом другом), от одного использования к другому это изменится так, что жестко закодированные выражения не будут работать.
Такое ощущение, что это должен быть простой саб, который запускается рекурсивно, но как только он обнаруживает, что элемент структуры данных является массивом или хэшем, я не знаю, как передать элемент в следующий рекурсивный вызов по ссылке так что он может быть изменен невременным способом. Следующий код дает сбой рекурсивно (хотя, если он не повторяется, он может изменить поверхностное значение в массиве верхнего уровня, и это изменение останется неизменным):
sub deep_nested_replace {
my ($d, $string) = @_;
if (ref($d) eq 'ARRAY') {
for (my $i=0; $i<scalar @$d; $i++) {
deep_nested_replace($d->[$i], $string);
}
}
elsif (ref($d) eq 'HASH') {
foreach my $k (keys %$d) {
deep_nested_replace($d->{$k}, $string);
}
}
elsif (defined $d) {
$d = $string;
}
}
Как мне сделать эту работу? Если это неправильный подход, то какой правильный?