3

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 也不起作用。

4

1 回答 1

5

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

分配$t浮点值时,仅存储数字表示。这就是为什么 first 的encode_json行为符合预期。然后转储变量会创建字符串表示形式,该字符串表示形式也存储在内存中。它不会删除数字表示,但在第二次调用encode_json中无法判断要使用哪种表示并接受字符串。

perl 5.18 现在已经 5 岁了,这种行为在 perl 的较新版本中得到了修复,所以我的建议是使用最新版本。

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

于 2018-07-19T23:18:03.357 回答