LINUX.ORG.RU

Удаление элементов из hash reference в рекурсивной функции

 , , recursive


0

3

Я сделал вот так:

sub doRDKFH {
 my ($hr,$k)=@_;
 if (ref($hr) eq 'ARRAY') {
  map {doRDKFH($_,$k)} grep {ref($_) eq 'HASH' or ref($_) eq 'ARRAY'} @{$hr}
 } else {
  delete @{$hr}{ref($k)?@$k:($k)};
  map {doRDKFH($_,$k)} grep {ref($_) eq 'HASH' or ref($_) eq 'ARRAY'} values $hr
 }
}

Предложите варианты @более_рациональной{быстрой,короткой} функции?

UP: Обновил для случая того, чтобы хэши с вложенными списками и списки с вложенными хэшами тоже обрабатывались

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 2)

А в чём смысл этого? Я скорей всего туплю, потому что не понимаю при чём тут рекурсивная функция, но если нужно удалить элементы из {хэша, массива}, то почему б не удалить весь хэш или массив?

Deleted
()

Те. сейчас у тебя стало возможным пройти по любой структуре из [] <~> {} и во всех хэшах удалить какой-то ключ?
Если не секрет в чём изначальная задач?

anonymous
()
Ответ на: комментарий от anonymous

s/какой-то ключ/заданные ключи/

anonymous
()
Ответ на: комментарий от Deleted

Нужно удалить все вхождения ключа в сложной структуре данных.

Мне это нужно было конкретно для Zabbix API: там объект, получаемый get-методом, нужно очень сильно «обкарнать», чтобы создать потом (на другом Zabbix'е, например) такой же объект.

Но, думаю, это не единственное применение :)

DRVTiny ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.