Perl Json编码中有对float的引用

时间:2018-07-19 19:27:34

标签: json perl data-dumper

perl version 5.18

我在perl JSON编码器上遇到问题,并在浮点数周围加上引号。

请参阅示例代码:

use JSON;
use Data::Dumper;

my $float = 1.2;

my $t = {
  float => $float
};  

my $json1 = encode_json($t);
print Dumper $t;
my $json2 = encode_json($t);
print $json1 . "\n";
print $json2 . "\n";

输出:

$VAR1 = {
          'float' => '1.2',
          'integer' => 1
        };
{"float":1.2,"integer":1}
{"float":"1.2","integer":1}

您可以在使用Dumper之后看到JSON编码器添加了引号。任何想法为什么会发生这种情况?

不在上面的示例代码中,但是在生产中,除非添加.01,否则无法删除引号。甚至* = * 1也不起作用。

1 个答案:

答案 0 :(得分:5)

这是一个“预期的”奇怪行为,由于perl处理变量的方式而发生(在旧版本的perl中)。每个变量可以具有数字和字符串表示形式,可以同时存储在内存中。在大多数情况下,perl会根据上下文使用适当的表示形式。

$t分配浮点值时,仅存储数字表示形式。这就是为什么第一个encode_json表现出预期的原因。然后转储变量将创建字符串表示形式,该字符串表示形式也将存储在内存中。它不会删除数字表示形式,但是在第二个调用encode_json中无法确定要使用哪种表示形式并采用字符串。

再一次,perl 5.18已有5年历史了,这种现象已在perl的较新版本中得到修复,因此我的建议是使用最新版本。

有关详细讨论,请参见https://www.perlmonks.org/?node_id=909619