perl json编码中的奇怪行为

时间:2014-08-06 15:11:15

标签: json perl

似乎将哈希值打印到文件可能会在内部发生变化。

将打印以下代码段(请注意1.6左右有双引号):

{"john":4,"mary":"1.6"}

代码段:

use JSON::XS;

$a = {};
$a->{john} += "4"; 
$a->{mary} += "1.6";
open ($fd, ">tmp.txt") || die "Failed to open file to write $!\n";
print $fd "$a->{mary}";
close $fd;
$b = encode_json($a);
print "$b\n";

如果我在写入上述文件时注释掉3行:

open ($fd, ">tmp.txt") || die "Failed to open file to write $!\n";
print $fd "$a->{mary}";
close $fd;

它将打印而不会在1.6左右双引号。

{"john":4,"mary":1.6}

我的perl是在Ubuntu 12.04 64bit上运行的5.14.2,JSON :: XS模块的版本是3.01。

不知道是什么导致了这一点。感谢。

2 个答案:

答案 0 :(得分:2)

  

似乎将哈希值打印到文件可能会在内部发生变化。

不,但是将字符串传递给加法运算符会。

$ perl -MDevel::Peek -e'$x="1.2"; Dump($x); 0+$x; Dump($x);' 2>&1 | grep FLAGS
  FLAGS = (POK,pPOK)
  FLAGS = (NOK,POK,pIOK,pNOK,pPOK)
  • POK =包含字符串。
  • NOK =包含浮点数。

传递字符串的副本将避免这种情况。

$ perl -MDevel::Peek -e'$x="1.2"; Dump($x); 0+"$x"; Dump($x);' 2>&1 | grep FLAGS
  FLAGS = (POK,pPOK)
  FLAGS = (POK,pPOK)

答案 1 :(得分:0)

感谢@ThisSuitIsBlackNot和@Paul Roub的链接,我做了一些小改动,以便编码的json字符串没有围绕数字的双引号:

open ($fd, ">tmp.txt") || die "Failed to open file to write $!\n";
$x = $a->{mary};
print $fd $x;
close $fd;

基本上我只是给中间变量分配一个哈希值并打印中间变量。