将不同的函数应用于Perl数据结构的每个元素

时间:2012-04-01 21:17:46

标签: json perl

给定一个任意嵌套的数据结构,我如何创建一个新的数据结构,使其中的所有元素都已经标准化,方法是根据元素的类型对所有元素应用一个函数。例如,我可能有

$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对象再次吐出。

我阅读the answers to executing a function on every element of a data structure并认为Data :: Rmap可能会解决问题,但无法弄清楚如何。 似乎Rmap也适用于所有,而不仅仅是

1 个答案:

答案 0 :(得分:2)

你提到的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);