применять различные функции к каждому элементу структуры данных Perl - PullRequest
3 голосов
/ 02 апреля 2012

Учитывая произвольно вложенную структуру данных, как я могу создать новую структуру данных, чтобы все ее элементы были стандартизированы путем применения функции ко всем элементам в зависимости от типа элемента. Например, у меня может быть

$data = {
    name => 'some one',
    date => '2010-10-10 12:23:45',
    sale => [34, 22, 65],
    cust => {
        name => 'Jimmy',
        addr => '1 Foobar Way',
        amnt => 452.024,
        item => ['books', 'pens', 'post-it notes']
    }
}

и я хочу преобразовать все текстовые значения в верхний регистр, все даты в значения времени даты UTC, найти квадрат всех целых чисел, округлить все действительные числа вниз и добавить 1 и т. Д. Поэтому я хочу применить к каждому элементу отдельную функцию в зависимости от типа элемента.

В действительности данные могут поступать через запрос к базе данных, в этом случае они уже являются структурой данных Perl, или они могут начинать жизнь как объект JSON, и в этом случае я могу использовать JSON::from_json для преобразования их в Perl структура данных. Идея состоит в том, чтобы стандартизировать все значения в структуре данных на основе типа значения, а затем снова выдать структуру данных Perl в виде объекта JSON.

Я читаю ответы на выполнение функции для каждого элемента структуры данных и чувствую, что Data :: Rmap может сработать, но не могу понять, как. Похоже, что Rmap работает на всех клавишах , а не только на значениях .

1 Ответ

2 голосов
/ 02 апреля 2012

Это просто безумие с Data :: Rmap , о котором вы говорили.

use Data::Rmap qw( rmap );
rmap { $_ = transform($_); } $data;

По поводу вопроса в комментариях:

use Data::Rmap   qw( rmap );
use Scalar::Util qw( looks_like_number );

# Transforms $_ in place.
sub transform {
   if (looks_like_number($_)) {
      if (...) {
         $_ *= 2;
      }

      $_ = 0+$_;  # Makes it look like a number to JSON::XS
   } else {
      ...
   }
}

&rmap(\&transform, $data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...