Json 对Perl数据结构的每个元素应用不同的函数

Json 对Perl数据结构的每个元素应用不同的函数,json,perl,Json,Perl,给定一个任意嵌套的数据结构,如何创建一个新的数据结构,以便根据元素的类型对所有元素应用函数,从而对其中的所有元素进行标准化。例如,我可能有 $data = { name => 'some one', date => '2010-10-10 12:23:45', sale => [34, 22, 65], cust => { name => 'Jimmy', addr => '1 Foobar Wa

给定一个任意嵌套的数据结构,如何创建一个新的数据结构,以便根据元素的类型对所有元素应用函数,从而对其中的所有元素进行标准化。例如,我可能有

$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也适用于所有的,而不仅仅是

,你提到的非常简单

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);

是的,它几乎起作用了。它似乎引用了所有的数字,把它们当作字符串。因此字符串转换工作正常,但数字不受影响。如果($data=~/\d+/){return$data*2;},则返回'34'而不是68@punkish,不,您将它们视为字符串。匹配运算符与字符串匹配。hmmm。。。我不知道。那么,如何确保数字被视为数字,而不是强制转换为字符串,而字符串仍然是字符串?我想在34之前(将其转换为68)或35.03之前(将其转换为36)做正确的事情,而不使用“34”和“35.03”。@bunkish,适当地使用
$\u0+$就可以了。